【问题标题】:How to dispose of a viewmodel in Durandal after deactivation停用后如何在 Durandal 中处理视图模型
【发布时间】:2017-01-04 11:44:54
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: javascript durandal


    【解决方案1】:

    Durandal 还提供了一个“附加的”生命周期钩子,仅当视图附加到 DOM 时才会触发。如果您将事件订阅放在这里,它们应该只会被订阅一次。

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

    编辑:

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

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

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

    viewmodel 本身只是一个托管的 javascript 对象,并且会在对它的所有引用消失后自动释放。

    【讨论】:

    • 取消订阅似乎可以解决问题;我的事件不再被多次调用。有什么方法可以实际检查以确保我的视图模型已被处理掉,或者您不会打扰?
    • 除非您实例化数百个视图模型,否则可能不值得付出努力,但您可以使用 Chrome 开发人员工具来监控 javascript 对象计数和内存分配,以确保垃圾收集器成功清理对象。
    【解决方案2】:

    它可能会保留对您的视图模型的引用,因为您订阅了事件“testEvent”但从未取消订阅。我不是如何在 javascript 中处理它的专家,但在 .net 中遇到过类似的场景

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多