17

使用下面的代码,input#p_in 将随着 input#s_in 的变化而更新。但我使用了 cleanNode(sec)。任何人都可以帮助理解为什么绑定没有被清除。

    <input id="p_in" data-bind="value: name"></input>
    <input id="s_in" data-bind="value: name"></input>
    <input id="cb" type="checkbox">same</input>

    <script type="text/javascript">
        function AddrDataSet (name) {
            this.name = ko.observable(name);
        };

        var primary_set = new AddrDataSet('p');
        var sec_set = new AddrDataSet('s');
        var pri = $('#p_in')[0];
        var sec = $('#s_in')[0];

        ko.applyBindings(primary_set, pri);
        ko.applyBindings(sec_set, sec);

        ko.cleanNode(sec); // clean it
        ko.applyBindings(primary_set, sec); // bind it to primary_set
        ko.cleanNode(sec); // clean it again

    </script>
4

1 回答 1

31

ko.cleanNodeKnockout 在内部使用它来清理它创建的与元素相关的数据/计算。它不会删除任何由绑定添加的事件处理程序,也不会理解绑定是否对 DOM 进行了更改。这肯定会导致问题,例如在随后再次绑定元素时将多个处理程序附加到元素上。

所以,我不建议使用这种模式。更好的模式是在一个部分周围使用withtemplate绑定,并允许使用新的绑定重新渲染它。

于 2013-02-25T14:40:09.393 回答