首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bindingHandlers中的还原更改2次无效

bindingHandlers中的还原更改2次无效
EN

Stack Overflow用户
提问于 2013-04-29 10:30:02
回答 1查看 252关注 0票数 0

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

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

以下是我的实际实现:

代码语言:javascript
复制
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 >>日期有效

不起作用的例子:

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

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

我发现的解决方法如下所示:强制双重连续更新(未定义+ null)。

代码语言:javascript
复制
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);            
    }
};

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

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-29 12:39:54

我认为您正在寻找的是valueHasMutated函数,它可能会被调用到一个可观察的位置,以强制它用最新的值更新它的订阅者。在您的示例中,您可以替换:

代码语言:javascript
复制
observable(undefined);                    
observable(null);

通过以下方式:

代码语言:javascript
复制
observable.valueHasMutated();

或者:

代码语言:javascript
复制
observable.notifySubscribers(null);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16276402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档