强制击倒以将可观察的标记标记为已更改(即使焦点仍在场中)

时间:2013-04-28 09:56:05

标签: knockout.js breeze

我用淘汰/微风开发了一个项目。

我想知道是否有可能强制淘汰赛将观察者标记为已更改(即使焦点仍在场中)。我的goad是通知用户,无论何时他开始更改日期,他都能够保存它(立即显示一个按钮)。例如,我有一个带日期的输入字段。用户开始在此字段中编辑日期。只有当用户离开该字段的焦点时,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。

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

感谢。

2 个答案:

答案 0 :(得分:9)

尝试observable.valueHasMutated()

修改 在其他评论中,您提到您将保存启用绑定到'context.hasChanges()'(从Breeze EntityManager更新?)。

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

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

你可能最好(没有双关语)考虑类似迈克尔答案的选项。也许在您的viewmodel中创建一个saveEnabled() observable,如:

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

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

答案 1 :(得分:0)

假设您的保存按钮已将enable绑定绑定到一个observable,让我们称之为saveEnabled,您应该能够使用事件处理程序触发它。 Knockout仅包含event绑定。

<input type="text" data-bind="dateRW: myDate, event: {keyup: function() {saveEnabled(true);}}">