如何正确处理 v2.0 中的小部件?据我所知,这应该是从 DOM 中删除时自动完成的,但是使用 jQuery.remove() 从 DOM 中删除我的小部件不会导致调用 canDeactivate() 或 deactivate() 。是否有特定的方法必须将其从 DOM 中删除才能调用停用回调?
最佳答案
是的,事实上是有的,而且很容易被忽略,因为它没有很好的记录。
Knockout 有一个实用函数ko.utils.domNodeDisposal.addDisposeCallback(element,callback)
。此函数确保在释放元素时调用回调。然而,在这种情况下,“处置”是非常具体的。 jQuery.remove()
不会触发它。处理节点的方法是使用 ko.removeNode(element)
,它不仅删除 DOM 元素(及其子元素),而且还会在绑定(bind)事件处理程序和这样的。 (抱歉,细节有点模糊。如果您想了解更多细节,可以随时查看 Knockout 的实现。)
在内部,处理 View 时,Durandal 使用 ko.removeNode
。因此,当删除 View 时,所有元素也会被删除,并且使用上述实用程序函数设置的任何 disposeCallbacks 将被调用。我相当确定 Durandal 会 Hook 此过程以触发停用回调。
TL;DR:尝试 ko.removeNode(element)
而不是 jQuery.remove(element)
。这将触发您的停用回调。
关于javascript - Durandal 2.0 小部件处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21190564/