Knockout:自定义绑定触发器的规则触发更新方法

时间:2015-02-17 10:36:07

标签: javascript knockout.js

有人可以告诉我为什么会这样吗?

<div id="test">
    <label data-bind="dateText: TheDate"></label>
</div>

ko.bindingHandlers.dateText = {
        update:         
                function(el, f_valueaccessor, allbindings, viewmodel, bindingcontext) 
        {
            // Get current value of supplied value
            var val = ko.unwrap(f_valueaccessor());

                        console.log('dt is ' + (typeof(val.dt) == 'function' ? '' : 'NOT ') + 'observable');

                        var dt = ko.unwrap(val.dt);

                        $(el).html(dt ? moment(dt).format('DD/MM/YYYY') : '');
                }
};

function Model(data, mapping)
{
        var _this = this;

        if(data)
                ko.mapping.fromJS(data, mapping, _this);

        this.TheDate = this.TheDate || { dt: ko.observable() }
}

var model = new Model({ TheDate: { dt: null } });

ko.applyBindings(model);

model.TheDate.dt('2001-01-01T01:01:01');

小提琴:http://jsfiddle.net/qkLzc5u5/2

我问的原因是我在实际应用程序中使这个自定义绑定工作时遇到问题 - 在那里,它显示任何初始日期很好,但更新没有反映在文本中 - 但IsDated计算确实更新,所以标签显示;只是空白。

我认为问题在于绑定附加到TheDate,这本身并不是可观察的;只有dt

但是,上面的代码实际上会触发更新,因此会显示日期01/01/2001,而由于初始值为null,我不希望显示任何内容。

现在这实际上就是我想要的行为,所以我对这段代码没有任何问题 - 我希望能更深入地了解自定义绑定如何知道何时触发,这样我就可以更好地调试我的真实世界代码。

(请注意,传递日期的对象模型由我无法更改的Web服务修复)

0 个答案:

没有答案