我有一个div,我使用敲除绑定。例如,
<div id='my_div'>
<span data-bind="text: dialog_body"></span>
</div>
所以,淘汰赛绑定是:
var viewmodel=function(){
this.dialog_body = 'Some text';
};
ko.applyBindings(new viewmodel(),$("#my_div")[0]);
现在的问题是:如果我调用$('#my_div').remove();
,这也会删除敲除绑定,还是应该担心内存泄漏?
答案 0 :(得分:0)
您不需要从DOM中删除范围。只需修改您的KO范围,即可包含可观察布尔值的“可见”绑定。然后,当你想“隐藏”你的跨度时,只需将布尔值设置为false。
<span data-bind="text: dialog_body, visible: show_span"></span>
然后在你的KO代码中,使你的布尔可观察:
var viewModel = {
show_span: ko.observable(true);
}
当你准备隐藏跨度时:
viewModel.show_span(false);
答案 1 :(得分:0)
jQuery与Knockout无关。它可以删除节点 - 但这不会清除任何绑定的KO observable。在给定的情况下,这意味着存在轻微的内存泄漏,因为KO在使用jQuery删除节点后通过内部集合(请参阅ko.utils.domData
)维护数据。
KO中用于清理的两个传统方法是cleanNode
和removeNode
(但是它们都不会删除绑定事件!)应该根据需要使用它们。使用cleanNode(在绑定的节点上) KO)是清理数据所需的最小。
然而,我不认为这是一个适合手动清理KO的地方!如果使用正确,标准绑定将已经处理清理。
相反,请编写如下代码。 (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
值可能来自“根”视图模型 - 我建议使用根视图模型! - 或者它可能来自一个窗口属性,对于那些感觉hackish的人:
window.someObservable = ko.observable()