【问题标题】:Durandal 2.0 Widget DisposalDurandal 2.0 小部件处理
【发布时间】:2016-02-04 20:42:30
【问题描述】:

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

【问题讨论】:

    标签: javascript jquery knockout.js durandal-2.0


    【解决方案1】:

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

    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)。这将触发您的停用回调。

    【讨论】:

    • 我发现淘汰赛的所有文档除了其绑定之外都没有详细说明细节。即使搜索 ko.removeNode 也不会给我官方文档的搜索结果。无论如何,感谢您的回答。 Rob Eisenberg 对我在 Durandals Google Group 上的帖子发表了同样的回复。使用 ko.removeNode(element) 确实给了我想要的行为。
    猜你喜欢
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-17
    相关资源
    最近更新 更多