javascript – 如何在停用后丢弃Durandal中的viewmodel

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

我试过删除它,这=未定义,但它们似乎不起作用.

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

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

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

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

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

最佳答案
Durandal还提供了一个“附加”生命周期钩子,它只在视图附加到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对象,在对它的所有引用消失后将自动处理.

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...