注册 dijit 后会发生以下情况;它由 dijit.registry._hash 引用:
function (widget) {
if (hash[widget.id]) {
throw new Error("Tried to register widget with id==" + widget.id + " but that id is already registered");
}
hash[widget.id] = widget;
this.length++;
}
现在,您时不时会有一个内容窗格,您可以在其中以编程方式放置一个小部件(因此,dojo.parser 以编程方式处理 cpane.unload 并取消引用/销毁解析器实例化的小部件)。
发生这种情况时,您需要挂钩某种形式的“卸载”,例如,当您调用 cpane.set('content' foo) 或 cpane.set('href', bar) 时。需要 Hook 来销毁和注销您保留的小部件实例 - 否则您的程序中会出现内存泄漏。
通常,一旦一个对象在任何地方都没有引用 - 它会从内存中清除,但是对于复杂的对象(例如小部件),“类变量”通常会引用一些 _outside _widget 范围,它将小部件标记为不安全删除到垃圾收集器......一旦你明白了这一点,你就会知道执行正确的生命周期,但在这个概念被完全理解之前。
您可以做的是用您自己的处理程序覆盖 dijit.registry 并让任何作为双联体的小部件自动销毁,如下所示:
// pull in registry in-sync and with global scoped
// accees (aka dijit.registry instead of dj_reg)
require({
async:false,
publishRequireResult:true
}, [
"dijit.registry"
], function(dj_reg) {
dijit.registry.add = function(widget) {
// lets change this bit
if (this._hash[widget.id]) {
this._hash[widget.id].destroy(); // optinally destroyRecursively
this.remove(widget.id)
}
this._hash[widget.id] = widget;
this.length++;
}
});