停用后如何在 Durandal 中处理视图模型
How to dispose of a viewmodel in Durandal after deactivation
我正在使用 durandal 和 requirejs 来组成我的视图模型。每次离开视图时,我也会连接到合成生命周期回调方法 deactivate
。我想用这种方法处理我的视图模型。
我试过 delete this
、this = 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 对象,将在所有对它的引用消失后自动销毁。
我正在使用 durandal 和 requirejs 来组成我的视图模型。每次离开视图时,我也会连接到合成生命周期回调方法 deactivate
。我想用这种方法处理我的视图模型。
我试过 delete this
、this = 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 对象,将在所有对它的引用消失后自动销毁。