如何在停用后丢弃Durandal中的视图模型

Viq*_*qas 5 javascript durandal

我正在使用durandal和requirejs来构建我的视图模型.deactivate每次我离开视图时,我也会进入组合生命周期回调方法.我想在这个方法中处理我的viewmodel.

我试过了delete this,this = undefined但它们似乎没有用.

我也使用这样的durandal事件聚合器:

self.activate = () => {
        App.trigger("testEvent");
    };

    App.on("testEvent").then(() =>
    {
        alert('Event Triggered!');
    });
Run Code Online (Sandbox Code Playgroud)

因此,每次加载视图模型时,都会触发事件.现在,如果我离开视图,然后导航回来(因此视图模型将再次加载),然后事件将被触发两次.如果我第三次导航到视图,事件将被触发3次,依此类推.所以之前的视图模型仍然存在,这就是每个视图模型触发durandal事件的原因.因此,要解决此问题,我需要在停用时处置viewmodels,我该怎么做?

注意.有问题的视图模型是瞬态的,而不是单例.

Jas*_*ake 2

Durandal 还提供了一个“附加”生命周期钩子,仅当视图附加到 DOM 中时才会触发。如果您将事件订阅放在这里,它们应该只会订阅一次。

http://durandaljs.com/documentation/Hooking-Lifecycle-Callbacks

编辑:

就取消订阅事件而言,如果您保存订阅的返回值,您可以稍后在 deactivate 或 detached 方法中调用 .off

var subscription = App.on("testEvent");
...
subscription.off();
Run Code Online (Sandbox Code Playgroud)

http://durandaljs.com/documentation/Leveraging-Publish-Subscribe.html

viewmodel 本身只是一个托管的 javascript 对象,在所有对其的引用消失后将自动处理。