javascript - Durandal 2.0 小部件处理

标签 javascript jquery knockout.js durandal-2.0

如何正确处理 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/

相关文章:

javascript - ng-显示不工作 Angular

javascript - 在最后一个元素上停止动画

使用搜索功能时,jQuery DataTables(旧版本)似乎向服务器发送了太多 ajax 调用

javascript - 从前端注入(inject) javascript 代码

javascript - 如何使用 jQuery 检查 ajax 调用是否存在?

javascript - 绑定(bind)到已检查事件的多个函数

javascript:分割字符串并替换值

javascript - 在本地存储中设置/获取 View 模型(如果存在) - knockout - javascript

javascript - 在没有 viewModel 的情况下使用 ko.observable 数组

javascript - Node.js 中的 "Users not defined"