2013-02-25 63 views
13

使用以下代码,输入#p_in将随着输入#s_in的更改而更新。但我已经使用了cleanNode(秒)。任何人都可以帮助理解为什么绑定不被清除。可以用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> 

回答

29

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

所以,我不会推荐使用这种模式。更好的模式是在节的周围使用withtemplate绑定,并允许使用新绑定重新呈现它。

+0

cleanNode实际上是一个内部API。目前没有专门的文档。 – 2013-02-28 13:01:12

+14

@RPNiemeyer能否详细说明“with”关键字如何解决这个问题?我处于类似的情况,并打开/关闭子模式窗口,我需要避免多次调用应用绑定。 – 2014-04-08 20:04:58

+1

我发现的一个合法用例是在测试绑定或组件时。我的afterEach函数清除了包含绑定测试设置的元素,然后在其上运行cleanNode以使KO将其忽略。然后我可以在每个之前开始下一个,再次设置测试绑定。这样我就完全封装了测试。 – 2015-11-26 15:18:07

1

不得不承认,我有点困惑,因为它works for me!你在看什么,你期望看到什么?

该代码将显示两个输入与value p,这是我所期望的。

+0

感谢您的回答。最初,我期望cleanNode将完全清理任何与绑定相关的数据(包括事件处理程序),以便我可以轻松地在viewModels之间切换一个元素的绑定。实际上,我想用一个复选框来控制绑定到一个元素的两个视图模型的切换。 – rxing 2013-02-25 21:52:08

+0

我看到的是,在更改输入#s_in后,输入#p_in的值也会更新。这不是我一开始期望的。 – rxing 2013-02-25 21:53:31

相关问题