我正在使用durandal和requirejs来构建我的视图模型。每当我离开视图时,我也会进入组合生命周期回调方法deactivate
。我想在这个方法中处理我的viewmodel。
我已尝试delete this
,this = undefined
但他们似乎无法工作。
我也在使用像这样的durandal事件聚合器:
self.activate = () => {
App.trigger("testEvent");
};
App.on("testEvent").then(() =>
{
alert('Event Triggered!');
});
因此,每次加载viewmodel时,都会触发该事件。现在,如果我离开视图,然后导航回来(因此视图模型将再次加载),然后事件将被触发两次。如果我第三次导航到视图,事件将被触发3次,依此类推。所以之前的视图模型仍然存在,这就是每个视图模型触发durandal事件的原因。因此,要解决此问题,我需要在停用时处置viewmodel,我该怎么做?
请注意。有问题的视图模型是瞬态的,而不是单例。
答案 0 :(得分:2)
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次。
尝试在取消激活方法中取消订阅,看看它是否有效。这将至少停止事件处理程序触发三次。我不确定这会正确处理你的视图模型。