2013-02-25 49 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

相關問題