jQuery有無關淘汰賽。它可以刪除節點 - 但這不會清除任何綁定的KO可觀察對象。在給定的情況下,這意味着有一個輕微的內存泄漏,因爲KO通過內部集合維護數據(請參閱ko.utils.domData
),只需使用jQuery刪除節點即可。
兩個後本身在KO用於清理傳統方法是cleanNode
和removeNode
(但是也不會除去結合事件!)根據需要應該使用哪個..使用cleanNode(經由KO結合的節點上)是最小需要清理數據。
然而,我不認爲這是一個合適的地方人工清理KO!如果使用正確,標準綁定將已經處理清理。
而是編寫如下的代碼。 (見Creating custom bindings that control descendant bindings爲withProperties
;你還必須要make it virtual-element compatible下面使用。)
<div id='my_div'>
<!--ko 'if': someObservable-->
<!--ko withProperties: { data: someObservable() }-->
<span data-bind="text: data.dialog_body"></span>
<!--/ko-->
<!--/ko-->
</div>
然後只需將觀察到的東西來創建節點..
someObservable(myVm)
..或undefined來清除它..
someObservable(undefined)
畢竟,一個一般不會真的$('#my_div').remove()
而是要$('#my_div').dialog('close')
。實際上,刪除節點也會起作用,只要稍後爲新對話框添加相同的元素即可。
someObservable
值可能來自「根」視圖模型 - 我建議有一個根視圖模型! - 或者它可能來自一個窗口屬性,爲那些感覺hackish:
window.someObservable = ko.observable()
jQuery不知道KO和KO不關心jQuery。看到[cleanNode在這裏討論](http://stackoverflow.com/questions/15063794/can-cleannode-be-used-to-clean-binding)或[這裏](http://stackoverflow.com/questions/10048485 /如何對透明除去可見的 - 綁定 - 在基因敲除-JS?LQ = 1)。但是,如果您將DOM構建爲僅從KO綁定(如果/ foreach/template/views-in-Durandal)被修改爲可觀察對象,則所有內容都應該自動清除。 – user2864740
謝謝,我無法使cleanNode工作。 html和viewmodel都是由jquery-ui動態生成的。所以,我試圖在綁定之前清理節點,但是如果沒有綁定,它會拋出錯誤。 – faisal