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

时间:2017-01-04 11:44:55

标签: javascript durandal

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

我已尝试delete thisthis = undefined但他们似乎无法工作。

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

杜兰达尔还提供了一个"附加"生命周期钩子,只有在DOM中附加视图时才会获取触发器。如果您在此处放置您的活动订阅,他们应该只订阅一次。

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

编辑:

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

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

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

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

答案 1 :(得分:1)

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

中遇到类似情况的专家

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

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