我有一个 div,我在其中使用了挖空绑定(bind)。例如,
<div id='my_div'>
<span data-bind="text: dialog_body"></span>
</div>
因此, knockout 绑定(bind)是:
var viewmodel=function(){
this.dialog_body = 'Some text';
};
ko.applyBindings(new viewmodel(),$("#my_div")[0]);
现在的问题是:如果我调用 $('#my_div').remove();
这是否也会删除 knockout 绑定(bind)或者我是否应该担心内存泄漏?
最佳答案
jQuery 与 Knockout 无关。它可以删除节点——但这不会清除任何绑定(bind)的 KO 可观察对象。在给定的情况下,这将意味着存在轻微内存泄漏,因为在使用jQuery。
KO 中使用的两种传统方法是 cleanNode
和 removeNode
(但是两者都不会删除绑定(bind)事件!)应根据需要使用 .. 使用 cleanNode (在通过 KO 绑定(bind)的节点上)是清理数据所需的最小值。
但是,我不认为这是一个适合手动清理 KO 的地方!如果使用正确,标准绑定(bind)将已经处理清理。
相反,编写如下代码。 (有关 withProperties
,请参阅 Creating custom bindings that control descendant bindings;您还必须 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>
然后简单地将 observable 设置为创建节点的东西..
someObservable(myVm)
.. 或未定义清除它..
someObservable(undefined)
毕竟,人们通常不会真的 $('#my_div').remove()
而是会 $('#my_div').dialog('close')
。实际上,删除节点也同样有效,只要稍后为新对话框添加回 相同 元素即可。
someObservable
值可能来自“根” View 模型——我建议使用 Root View 模型! - 或者它可能来自窗口属性,对于那些感觉很老套的人:
window.someObservable = ko.observable()
关于javascript - jquery remove 函数是否也删除了 knockout 绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20482250/