1

myWidget.addOnLoad(...) のようなイベントに登録する関数を呼び出すことができるように、カスタム Dojo クラスに「onload」関数を追加したいと考えています。

私のクラスは Dijit ではなく、dojo.declare を使用する単純なクラスです。作成時に、クラスを初期化するためにいくつかの関数 (xhr など) が呼び出され、ウィジェットがロードされて準備ができていることを他の JavaScript 関数に通知する機能が必要です。

4

3 に答える 3

1

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

于 2009-07-17T10:03:45.237 に答える
0

そこで、先に進み、基本的に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();
    }
}
于 2009-07-13T14:29:03.483 に答える