我在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模块实现这个目的。
答案 0 :(得分:2)
对于其他正在研究相同问题的人来说,有一种实现同样目标的淘汰方式。请查看以下链接https://github.com/BlueSpire/Durandal/issues/139和https://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。