Javascript Durandal 2.0小部件处理

Javascript Durandal 2.0小部件处理,javascript,jquery,knockout.js,durandal-2.0,Javascript,Jquery,Knockout.js,Durandal 2.0,在v2.0中,应该如何正确地处理小部件?据我所知,当从DOM中删除时,这应该是自动完成的,但是使用jQuery.remove()从DOM中删除我的小部件不会导致调用canDeactivate()或deactivate()。是否有一种特定的方法必须从DOM中删除它才能调用停用回调?是的,事实上有,而且很容易错过,因为它没有很好的文档记录 Knockout有一个实用函数ko.utils.domNodeDisposal.addDisposeCallback(元素,回调)。此函数确保在释放元素时调用回调

在v2.0中,应该如何正确地处理小部件?据我所知,当从DOM中删除时,这应该是自动完成的,但是使用jQuery.remove()从DOM中删除我的小部件不会导致调用canDeactivate()或deactivate()。是否有一种特定的方法必须从DOM中删除它才能调用停用回调?

是的,事实上有,而且很容易错过,因为它没有很好的文档记录

Knockout有一个实用函数
ko.utils.domNodeDisposal.addDisposeCallback(元素,回调)
。此函数确保在释放元素时调用回调。然而,“处置”在这种情况下非常具体
jQuery.remove()
不会触发它。处理节点的方法是使用
ko.removeNode(element)
,它不仅删除DOM元素(及其子元素),而且还对绑定事件处理程序等进行一些额外的清理。(很抱歉,细节有点模糊。如果您想了解更多细节,可以随时查看Knockout的实现。)

在内部,当处理视图时,Durandal使用
ko.removeNode
。因此,删除视图时,所有元素也将被删除,并且将调用使用上述实用程序函数设置的任何disposeCallbacks。我相当肯定Durandal钩住了这个过程,触发了deactivate的回调


TL;DR:尝试
ko.removeNode(元素)
而不是
jQuery.remove(元素)
。这将触发您的停用回调。

我发现knockout的文档中除了绑定外,其他所有内容都没有详细说明。即使搜索ko.removeNode也不会给我官方文档的搜索结果。无论如何,谢谢你的回答。罗布·艾森伯格(Rob Eisenberg)在回复我在杜兰达尔谷歌集团(Durandals Google Group)上的帖子时也表示了同样的看法。使用ko.removeNode(元素)确实可以提供所需的行为。