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++;
}
現在、プログラムでウィジェットを配置する contentpane が時々あります (プログラムで、dojo.parser は cpane.unload を処理し、パーサーによってインスタンス化されたウィジェットを derefences / destroy します)。
これが発生した場合、cpane.set('content' foo) または cpane.set('href', bar) を呼び出すときのように、何らかの形式の「アンロード」にフックする必要があります。保持しているウィジェットのインスタンスを破棄して登録解除するには、フックが必要です。そうしないと、プログラムでメモリリークが発生します。
通常、オブジェクトがどこにも参照を持たなくなると、メモリから消去されますが、ウィジェットなどの複雑なオブジェクトでは、「クラス変数」が _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++;
}
});