【问题标题】:Revert changes in a bindingHandlers 2 times did not works在 bindingHandlers 中还原更改 2 次无效
【发布时间】:2013-04-22 23:40:58
【问题描述】:

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

注意:输入日期的输入框是可观察的(从微风中查询)。

这是我的实际实现:

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);            
    }
};

运行良好的示例:

  • 用户正在输入 25/12/2013 >> 日期有效
  • 接下来,用户正在输入 1234 >> 日期无效 >> 输入框被清除
  • 接下来,用户输入 01/04/2013 >> date is valid

示例不起作用:

  • 用户正在输入 1234 >> 日期无效 >> 输入框被清除
  • 接下来,用户正在输入 5678 >> 日期(再次!)无效 >> 输入框不再被清除!!

输入框不再被清除的原因是因为在上一步中 observable 已经设置为 null 并且我们知道如果 observable 没有改变他的值,就不会触发更新。

我找到的解决方法如下:强制双连续更新(未定义+空)。

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(undefined);                    
                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);            
    }
};

我不喜欢那样做。也许有更好的方法?

谢谢。

【问题讨论】:

    标签: knockout.js breeze


    【解决方案1】:

    我认为您正在寻找的是 valueHasMutated 函数,该函数可以在可观察对象上调用以强制它使用最新值更新其订阅者。在您的示例中,您可以替换:

    observable(undefined);                    
    observable(null);
    

    与:

    observable.valueHasMutated();
    

    或:

    observable.notifySubscribers(null);
    

    【讨论】:

    • 不幸的是它不起作用。我收到了错误dependentObservable has no method valueHasMutated
    • 这是一个计算出来的 observable 吗?
    • 这不是一个计算的 observable。这是一个由微风提供的 observable(查询每个字段都是 observable 的表)。
    • 嗯,这很奇怪(参见stackoverflow.com/q/8537397/866172),因为任何可观察对象通常都有这个功能。也许您可以尝试使用“notifySubscribers”,请参阅我的更新答案
    • 通过结合observable(null);observable.notifySubscribers(null); 它可以工作。我需要两者,因为notifySubscribers 不更新数据,它只通知某些数据已更改。谢谢。你的帮助很有帮助。
    猜你喜欢
    • 2013-05-19
    • 2014-04-01
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    相关资源
    最近更新 更多