【发布时间】:2016-02-04 20:42:30
【问题描述】:
应该如何在 v2.0 中正确处理小部件?从我读过的内容来看,这应该是在从 DOM 中删除时自动完成的,但是使用说 jQuery.remove() 从 DOM 中删除我的小部件不会导致调用 canDeactivate() 或 deactivate() 。是否有一种特定的方式必须从 DOM 中删除才能调用停用回调?
【问题讨论】:
标签: javascript jquery knockout.js durandal-2.0
应该如何在 v2.0 中正确处理小部件?从我读过的内容来看,这应该是在从 DOM 中删除时自动完成的,但是使用说 jQuery.remove() 从 DOM 中删除我的小部件不会导致调用 canDeactivate() 或 deactivate() 。是否有一种特定的方式必须从 DOM 中删除才能调用停用回调?
【问题讨论】:
标签: javascript jquery knockout.js durandal-2.0
是的,事实上有,而且很容易错过,因为它没有很好地记录。
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)。这将触发您的停用回调。
【讨论】: