停用后如何在 Durandal 中处理视图模型

How to dispose of a viewmodel in Durandal after deactivation

我正在使用 durandal 和 requirejs 来组成我的视图模型。每次离开视图时,我也会连接到合成生命周期回调方法 deactivate。我想用这种方法处理我的视图模型。

我试过 delete thisthis = undefined,但它们似乎不起作用。

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

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

    App.on("testEvent").then(() =>
    {
        alert('Event Triggered!');
    });

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

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

它可能会保留对您的视图模型的引用,因为您正在订阅事件 'testEvent' 但从未退订。我不是它在 javascript 中如何处理的专家,但在 .net

中遇到过类似的情况

您的事件不会被触发三次,它会被触发一次,但事件处理函数将在每次订阅后被调用,因此在 3 次导航后,3 次。

尝试在停用方法中取消订阅,看看是否有效。这至少会阻止事件处理程序触发三次。不过,我不确定这是否会正确处理您的视图模型。

Durandal 还提供了一个 "attached" 生命周期挂钩,只有当视图附加到 DOM 时才会触发。如果您将事件订阅放在此处,它们应该只会订阅一次。

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

编辑:

就取消订阅事件而言,如果您从订阅中保存 return 值,您可以稍后在停用或分离方法中调用 .off

var subscription = App.on("testEvent");
...
subscription.off();

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

视图模型本身只是一个托管的 javascript 对象,将在所有对它的引用消失后自动销毁。