knockout.js - 强制 knockout 以将可观察对象标记为已更改(即使焦点仍在该字段中)

标签 knockout.js breeze

我开发了一个带有 knockout/Breeze 的项目。

我想知道是否可以强制 knockout 以将可观察对象标记为已更改(即使焦点仍在现场)。我的目标是通知用户,每当他开始更改日期时,他都可以保存它(立即显示一个按钮)。例如,我有一个带日期的输入字段。用户开始在此字段中编辑日期。当用户离开该字段的焦点时,observable 应该只解释新的编码日期。但我想展示我的Save button一旦他开始在输入字段中输入内容。我希望我很清楚。

这是我的 bindingHandlers,用于在我的输入中处理编辑日期:

ko.bindingHandlers.dateRW = {
    //dateRW --> the 'read-write' version used both for displaying & updating dates
    init: function (element, valueAccessor, allBindingsAccessor) {
        var observable = valueAccessor();
        var value = ko.utils.unwrapObservable(valueAccessor);
        //handle the field changing
        ko.utils.registerEventHandler(element, "change", function () {                
            var myDate = moment($(element).val(), "DD/MM/YYYY");
            observable(myDate.toDate());
        });
        //ko.utils.registerEventHandler(element, "keyup", function () {
        //    As soon as user begin to type something, I would like to show my save button
        //});
    },
    update: function (element, valueAccessor, allBindingsAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor());
        var date = (typeof value !== 'undefined') ? moment(value) : null;
        var dateFormatted = (date != null) ? date.format('DD/MM/YYYY') : '';
        $(element).val(dateFormatted);
    }
};

而我的观点:
<input type="text" data-bind="dateRW: myDate" />

不幸的是 valueUpdate: 'afterkeydown'不起作用,因为我使用的是自定义 bindingHandlers。

希望有人能指出我正确的方向。

谢谢。

最佳答案

试试 observable.valueHasMutated()
编辑
在您提到的其他评论中,您将启用的保存绑定(bind)到“context.hasChanges()”(从 Breeze EntityManager 更新?)。

我相信 Breeze 不会更新 hasChanges通过订阅 Knockout 可观察通知。我认为它实际上包含了 observable 设置功能,并且还检查以确保该值实际上正在改变。换句话说,我相信您实际上必须更改您的 observables 值(然后返回)才能触发 hasChanges() .

另一个(不太好的)选项可能是尝试返回可观察对象的父对象并获取它的EntityAspect。 .然后您可以调用` setModified() '。在绑定(bind)处理程序中执行所有这些操作似乎是个坏主意,因为它真的开始假设您要绑定(bind)的可观察对象是 Breeze 实体上的一个属性。

您可能最好(没有双关语)考虑类似于迈克尔的答案的选项。也许创建一个 saveEnabled()在您的 View 模型中可观察到,例如:

var saveEnabled = ko.observable(false);
context.hasChanges.subscribe(function() { saveEnabled(true); });

然后您可以使用 keyup Michael 建议的绑定(bind)或添加另一个 subscribe在您可观察的日期以上 - 并返回调用 valueHasMutated()在绑定(bind)处理程序中(如果你能找到它)。

关于knockout.js - 强制 knockout 以将可观察对象标记为已更改(即使焦点仍在该字段中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16261689/

相关文章:

javascript - knockout 值绑定(bind)到 HTML5 日期选择器 (Chrome)

javascript - 如何使用 EntityManager 的 saveChanges() 方法保存单个实体?

entity-framework - Breeze 兼容的 JavaScript GUI 框架

breeze - 忽略代码首先生成的实体中的属性

Breeze 和 RESTful Web API

c# - 如果数字不是 double 值,则无法显示最多两位小数值的 double 类型值

javascript - knockout.js 引用父对象

jquery - 在 Knockout 数据绑定(bind)文本中包含 span 元素

javascript - 为什么这个 knockout 代码没有获取绑定(bind)到 ObservableArray 的更改?

OData Any and All 与 JayData 或 Breeze