应该如何在 v2.0 中正确处理小部件?从我读过的内容来看,这应该是在从 DOM 中删除时自动完成的,但是使用说 jQuery.remove() 从 DOM 中删除我的小部件不会导致调用 canDeactivate() 或 deactivate() 。是否有一种特定的方式必须从 DOM 中删除才能调用停用回调?
问问题
641 次
1 回答
2
是的,事实上有,而且很容易错过,因为它没有很好的记录。
Knockout 具有实用功能ko.utils.domNodeDisposal.addDisposeCallback(element, callback)
。此函数确保在处理元素时调用回调。但是,在这种情况下,“处置”是非常具体的。jQuery.remove()
不会触发它。处理节点的方法是使用ko.removeNode(element)
,它不仅会删除 DOM 元素(及其子元素),还会在绑定事件处理程序等方面进行一些额外的清理。(对不起,细节有点模糊。如果你想了解更多细节,可以随时查看 Knockout 的实现。)
在内部,当处理视图时,Durandal 使用ko.removeNode
. 因此,当一个视图被移除时,所有元素也会被移除,并且任何使用上述实用函数设置的 disposeCallbacks 都会被调用。我相当确定 Durandal 会钩入此过程以触发停用回调。
TL;DR:尝试ko.removeNode(element)
代替jQuery.remove(element)
. 这将触发您的停用回调。
于 2014-01-20T15:03:46.833 回答