jquery删除函数是否也删除了敲除绑定?

时间:2013-12-09 22:33:09

标签: javascript jquery html knockout.js

我有一个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();,这也会删除敲除绑定,还是应该担心内存泄漏?

2 个答案:

答案 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中用于清理的两个传统方法是cleanNoderemoveNode(但是它们都不会删除绑定事件!)应该根据需要使用它们。使用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()