1

我在我的小部件的控制器代码上设置了一些 setInterval 值,如下所示:

define(['durandal/widget'],function (widget) {
    var count = 0;
    var intervals = [],
        ctor = function (element, settings) {
               this.settings = settings;
        };

    ctor.prototype.updateCount = function( ){
            var interval = setInterval(function () {
            count = count + 1;
            return count;
            }, 1000);
            intervals.push(interval);
          }   
    return ctor;
}

上面的代码在视图内的 forEach 循环中运行,例如:

<div data-bind="foreach: {data: settings.items}">
 <span class="count" data-bind="text:$parent.updateCount()"></span>
</div>

我想要做的是clearInterval在小部件被销毁或基本上从 dom 中删除时调用间隔数组中所有项目的方法。我知道我可以使用 viewModel 上的 deactivate 来做到这一点,但从可重用性的角度来看,我希望小部件本身能够处理间隔的清除。有什么方法可以使用 Durandal 中的小部件模块来实现这一点。

4

2 回答 2

2

对于其他研究相同问题的人来说,有一种淘汰方法可以实现相同的目标。查看以下链接https://github.com/BlueSpire/Durandal/issues/139https://groups.google.com/forum/#!topic/durandaljs/NqUkY-9us2g。建议使用:

ko.utils.domNodeDisposal.addDisposeCallback(element, callback)
于 2013-05-05T13:55:29.950 回答
0

只要使用 JQuery 的“删除”函数删除小部件,在此“删除”函数上添加自定义事件处理程序应该如下所示:

var self = this;
var self.count = 0;
var self.intervals = [];
self.ctor = function (element, settings) {
    $(element).on("remove", function () {
        $.each(self.intervals, function(index, ival) { 
            clearInterval(ival); 
        });
    });
    this.settings = settings;
};

问题是,如果在没有 JQuery 的情况下删除小部件,只需通过操作 DOM,就不会触发事件。然后,您可以实现DOMNodeRemoved事件的代码,但它不适用于 IE ...

编辑:如果您使用的是 1.9.1 之前的 JQuery,您可能需要查看此问题的其他答案

于 2013-04-29T16:59:21.387 回答