Durandal小部件销毁方法或等效的东西

时间:2013-04-29 16:34:43

标签: javascript knockout.js durandal

我在widget的控制器代码上设置了一些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>

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

2 个答案:

答案 0 :(得分:2)

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

ko.utils.domNodeDisposal.addDisposeCallback(element, callback)

答案 1 :(得分: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 事件的代码,but it's not gonna work for IE ......

编辑:如果您使用的是1.9.1之前的JQuery,您可能需要查看other answers to this question