可以使用cleanNode()来清除绑定吗?

rxi*_*ing 15 knockout.js

使用下面的代码,输入#p_in将随输入#s_in的更改而更新.但我使用了cleanNode(秒).任何人都可以帮助理解绑定未清除的原因.

    <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>
Run Code Online (Sandbox Code Playgroud)

RP *_*yer 31

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

所以,我不建议使用这种模式.更好的模式是使用withtemplate围绕一个部分绑定,并允许使用新绑定重新呈现它.

  • @RPNiemeyer你能详细说明"with"关键字如何解决这个问题?我处于类似的情况,打开/关闭子模式窗口,我需要避免多次调用apply绑定.. (17认同)
  • 与@SonicSoul相同 (2认同)