myWidget.addOnLoad(...) のようなイベントに登録する関数を呼び出すことができるように、カスタム Dojo クラスに「onload」関数を追加したいと考えています。
私のクラスは Dijit ではなく、dojo.declare を使用する単純なクラスです。作成時に、クラスを初期化するためにいくつかの関数 (xhr など) が呼び出され、ウィジェットがロードされて準備ができていることを他の JavaScript 関数に通知する機能が必要です。
myWidget.addOnLoad(...) のようなイベントに登録する関数を呼び出すことができるように、カスタム Dojo クラスに「onload」関数を追加したいと考えています。
私のクラスは Dijit ではなく、dojo.declare を使用する単純なクラスです。作成時に、クラスを初期化するためにいくつかの関数 (xhr など) が呼び出され、ウィジェットがロードされて準備ができていることを他の JavaScript 関数に通知する機能が必要です。
jburkeがすでに指摘したように、Dojo を使用すると簡単に作成できます。必要なのは dojo.connect だけです。次に例を示します。
a = {
loaded: function() { console.log('[a] loaded'); }
}
b = {
dependentAction: function() { console.log('[b] dependentAction'); }
}
dojo.connect( a, 'loaded', b, 'dependentAction' );
a.loaded()
// prints:
// [a] loaded
// [b] dependentAction
そして、a.loaded()
ロードが終わったら実行するだけですa
。
そこで、先に進み、基本的にDojo addOnLoad関数をコピーして、クラスに追加しました。動作しているようです。pub / subまたはdojo.connectを実行することを検討しましたが、これが最もクリーンで最も認識しやすいソリューションであると感じています。
以下は、それを実行するために必要なビットです。これもdojo.jsから削除され、私のクラスにプラグインされています。
_onto : function(arr, obj, fn){
if(!fn){
arr.push(obj);
}else if(fn){
var func = (typeof fn == "string") ? obj[fn] : fn;
arr.push(function(){ func.call(obj); });
}
},
_loaded : function() {
this._loadNotifying = true;
this._postLoad = true;
var mll = this._loaders;
for(var x = 0; x < mll.length; x++){
try{
mll[x]();
}catch(e){
throw e;
console.error("addOnLoad callback failed: " + e, e); /* let other load events fire, like the parser, but report the error */
}
}
this._loadNotifying = false;
//Make sure nothing else got added to the onload queue
//after this first run. If something did, and we are not waiting for any
//more inflight resources, run again.
if(this._postLoad && this._inFlightCount == 0 && mll.length){
this._loaded();
}
},
addOnLoad : function(/*Object?*/obj, /*String|Function?*/functionName){
this._onto(this._loaders, obj, functionName);
if(this._postLoad && !this._loadNotifying){
this._loaded();
}
}