Javascript jqueryremove函数是否也会删除敲除绑定?

Javascript jqueryremove函数是否也会删除敲除绑定?,javascript,jquery,html,knockout.js,Javascript,Jquery,Html,Knockout.js,我有一个div,在那里我使用敲除绑定。比如说, <div id='my_div'> <span data-bind="text: dialog_body"></span> </div> 现在的问题是:如果我调用$(“#my_div”).remove()这是否也会删除敲除绑定,或者我是否应该担心内存泄漏?您不需要从DOM中删除span。只需修改KO范围,以包含可观察布尔值的“可见”绑定。然后,当您想“隐藏”量程时,只需将布尔值设置为false

我有一个div,在那里我使用敲除绑定。比如说,

<div id='my_div'>
  <span data-bind="text: dialog_body"></span> 
</div>

现在的问题是:如果我调用
$(“#my_div”).remove()
这是否也会删除敲除绑定,或者我是否应该担心内存泄漏?

您不需要从DOM中删除span。只需修改KO范围,以包含可观察布尔值的“可见”绑定。然后,当您想“隐藏”量程时,只需将布尔值设置为false

<span data-bind="text: dialog_body, visible: show_span"></span>
当您准备好隐藏跨度时:

viewModel.show_span(false);

jQuery与敲除无关。它可以删除节点,但这不会清除任何绑定的KO观测值。在给定的情况下,这意味着在使用jQuery简单地删除节点后,KO通过内部集合(请参见
KO.utils.domData
)维护数据时会出现轻微的内存泄漏

KO中用于自身后清理的两种传统方法是
cleanNode
removeNode
(但是这两种方法都不会删除绑定事件!),应根据需要使用。。使用cleanNode(在通过KO绑定的节点上)是清理数据所需的最低要求


然而,我不认为这是一个合适的地方手动清理高!如果使用正确,标准绑定将已经处理清理

相反,编写如下代码。(有关属性的
请参见;您还必须按如下方式使用它。)

。。或未定义以清除它

someObservable(undefined)
毕竟,人们通常不会真正地
$('my#div').remove()
,而是宁愿
$('my#div').dialog('close')
。实际上,只要稍后为新对话框添加相同的元素,删除节点也可以

someObservable
值可能来自“根”视图模型-我建议使用根视图模型或者它可能来自一个窗口属性,对于那些感觉不舒服的人:

window.someObservable = ko.observable()

jQuery不知道KO,KO也不关心jQuery。看到或看到。但是,如果您将DOM的结构设置为仅从observables上的KO绑定(if/foreach/template/views in Durandal)进行修改,那么所有内容都应该自动清理。谢谢,我无法让cleanNode工作。html和viewmodel都是由jQueryUI动态生成的。因此,我尝试在绑定之前清理节点,但如果没有绑定,就会抛出错误。我的问题比我给出的示例更复杂。我试图在jquery ui对话框上绑定敲除模板。拥有全局可观察对象对我来说不是一个选项,因为我正在一个非常大的项目中工作,全局变量可能会把事情搞砸。但是,如果我可以从一个id中获取当前绑定,那么我可以更改该绑定上的可观察对象。也许,
ko.dataFor
ko.contextFor
会有帮助。@faisal听起来这个大项目需要一些爱!我仍然建议采用上述方法,但要使可观察部分成为包含模型的一部分。你考虑过使用吗?它使得将模型应用于不同的“视图”变得容易。(虽然它支持SPA,但它不需要用作SPA。)好的,我来看看Durandal。谢谢我将试用它,并让您知道。@faisal使用
cleanNode
会很好,但是,请确保只在绑定节点上使用它。您可以使用
ko.contextFor
进行检查(对于非绑定节点,它应该返回undefined)。。或者,如果在非绑定节点上使用异常,请尝试/捕获该异常。请确保分别删除DOM事件。我看到了您的编辑。my_div最初不是页面的一部分,但后来由jQueryUI对话框添加,添加时,其内容从外部淘汰模板加载,然后绑定。
<div id='my_div'>
  <!--ko 'if': someObservable-->
    <!--ko withProperties: { data: someObservable() }-->
      <span data-bind="text: data.dialog_body"></span> 
    <!--/ko-->
  <!--/ko-->
</div>
someObservable(myVm)
someObservable(undefined)
window.someObservable = ko.observable()