【问题标题】:KnockoutJS relation between observable and data-bind可观察和数据绑定之间的 KnockoutJS 关系
【发布时间】:2012-10-01 01:36:24
【问题描述】:

我有视图模型

var viewModel = {
    amount: ko.observable(1),
    rate: ko.observable(2),
    rate222: ko.observable(2)
};


<input data-bind="value: amount" />
<input data-bind="value: rate" />

我怎么知道 rate222 没有绑定在这个文件上?

  • 多页验证需要它,在现有文档上声明!

最好的问候


更新:

这里没有解决这个问题 jsfiddle.net/x26sS/14 绑定值“rate222”不在DOM中,但是淘汰赛不这么认为:“show,rate12312”。

【问题讨论】:

    标签: javascript knockout.js knockout-validation


    【解决方案1】:

    在 Knockout 中没有一个很好的方法来明确知道一个元素是开箱即用的。

    编写一个自定义绑定非常容易,将 bound 标志添加到可观察或计算的标志,然后您可以在查找“未绑定”属性时使用。

    绑定可能看起来像:

    ko.bindingHandlers.track = {
        init: function(element, valueAccessor) {
           var observable = valueAccessor();
           if (ko.isObservable(observable)) {
               observable.bound = true;  
           }
    
           //clear the flag if this element is removed
           ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
                var observable = valueAccessor();
                if (ko.isObservable(observable)) {
                    observable.bound = false;     
                }     
           });           
        }
    };
    

    您甚至可以包装值绑定以向其中添加此功能。

    这是一个示例,它在元素上使用此绑定,然后提供一个函数来遍历视图模型(仅示例中的顶级)并查找任何未绑定的属性。

    http://jsfiddle.net/rniemeyer/x26sS/

    【讨论】:

    • 这里没有解决这个问题jsfiddle.net/x26sS/14绑定值“rate222”不在DOM中,但是淘汰赛不这么认为:“show,rate12312”。
    • 您看到的问题是因为当您向data 的订阅者触发通知时,这实际上会重新呈现您手动订阅后发生的模板,因此设置了绑定布尔值再次。处理这个问题的一个好方法是在你的绑定中添加一个处理回调,当元素被删除时清除它:jsfiddle.net/rniemeyer/x26sS/17
    猜你喜欢
    • 2012-11-02
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    • 2012-04-20
    • 2014-10-01
    • 2015-09-18
    相关资源
    最近更新 更多