Knockout.js 将BindingHandler中的更改还原2次无效

Knockout.js 将BindingHandler中的更改还原2次无效,knockout.js,breeze,Knockout.js,Breeze,我正在开发一个自定义BindingHandler来显示/编辑输入框中的日期。每当用户键入无效日期时,我都希望清除输入框 注:输入日期的输入框是可观察的(从breeze查询) 以下是我的实际实现: ko.bindingHandlers.dateRW = { //dateRW --> the 'read-write' version used both for displaying & updating dates init: function (element, va

我正在开发一个自定义BindingHandler来显示/编辑输入框中的日期。每当用户键入无效日期时,我都希望清除输入框

注:输入日期的输入框是可观察的(从breeze查询)

以下是我的实际实现:

ko.bindingHandlers.dateRW = {
    //dateRW --> the 'read-write' version used both for displaying & updating dates
    init: function (element, valueAccessor, allBindingsAccessor) {
        var observable = valueAccessor();            
        //handle the field changing
        ko.utils.registerEventHandler(element, "change", function () {
            var value = $(element).val();
            var dateFormatted = moment.utc(value, "DD/MM/YYYY");
            if (dateFormatted!=null && dateFormatted.isValid())
                observable(dateFormatted.toDate())
            else {
                observable(null);
            }
        });
    },
    update: function (element, valueAccessor, allBindingsAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor());
        var date = (typeof value !== 'undefined') ? moment.utc(value) : null;
        var dateFormatted = (date != null) ? date.format('DD/MM/YYYY') : '';
        $(element).val(dateFormatted);            
    }
};
运行良好的示例:

  • 用户正在键入2013年12月25日>>日期有效
  • 接下来,用户输入1234>>日期无效>>输入框被清除
  • 接下来,用户键入01/04/2013>>日期有效
不起作用的例子:

  • 用户正在键入1234>>日期无效>>输入框已清除
  • 接下来,用户键入5678>>日期(再次!)无效>>输入框不再清除
输入框不再被清除的原因是,在上一步中,observable已设置为null,我们知道,如果observable没有更改其值,则不会触发更新

我发现的解决方法如下:强制两次连续更新(未定义+null)

我不喜欢这样继续下去。也许有更好的办法


谢谢。

我想你要找的是
valuehassmutated
函数,它可以在可观察对象上调用,以迫使它用最新的值更新其订户。在您的示例中,您可以替换:

observable(undefined);                    
observable(null);
与:

或:


不幸的是,它不起作用。我得到了错误
dependentObservable没有方法值hassmutated
。这是一个计算的可观测值?这不是一个计算的可观测值。这是breeze提供的一个可观测值(查询了每个字段都可观测的表)。这非常奇怪(请参阅),因为任何可观测值通常都有这个函数。也许你可以尝试使用“notifySubscribers”,通过组合
observable(null)查看我的更新答案
可观察。notifySubscribers(空)它可以工作。我需要两者,因为
notifySubscribers
不更新数据,它只通知某些数据已更改。谢谢你的帮助是有益的。
observable(undefined);                    
observable(null);
observable.valueHasMutated();
observable.notifySubscribers(null);