2009-07-13 22 views
1

Ich möchte ein „onload“ -Funktion zu meinen benutzerdefinierten Dojo Klasse hinzuzufügen, so dass sie Funktionen aufrufen können, die für die Veranstaltung registrieren, um - so etwas wie myWidget.addOnLoad (...)Wie füge ich "Onload" zu meiner Dojo-Klasse hinzu?

Meine Klasse ist ein nicht Dijit ist eine einfache Klasse, die dojo.declare verwendet. Nach der Erstellung werden mehrere Funktionen aufgerufen (xhr, etc), um die Klasse zu initialisieren und ich muss die Fähigkeit haben, andere JavaScript-Funktionen zu benachrichtigen, dass das Widget & bereit ist.

Antwort

1

Als jburke already pointed out Dojo macht es Ihnen leicht: dojo.connect ist alles was Sie brauchen. Hier ein Beispiel:

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 

Und dann nur a.loaded() ausführen, nachdem Sie mit dem Laden a fertig sind.

+0

Maine, danke für das klare Beispiel. Ich werde immer noch AddOnLoaded als Einstiegspunkt verwenden, sondern nur dojo.connect() aufrufen. – olore

0

Also ging ich voran & kopiert im Grunde die Dojo AddOnLoad Funktionen & hat es zu meiner Klasse hinzugefügt. Es scheint zu funktionieren. Ich habe versucht, ein Pub/Sub oder Dojo.connect zu machen, aber ich denke, das war die sauberste und erkennbarste Lösung.

Im Folgenden sind die erforderlichen Bits, um es geht, wieder aus dojo.js gestrippt und in meine Klasse gesteckt:

_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(); 
    } 
} 
+0

Ich sehe nicht, wie das funktionieren würde. Rufen Sie _loaded außerhalb dieses Codebeispiels irgendwo auf? – seth

+0

seth du hast Recht, ich verschonte den riesigen Teil des Codes, der ausgeführt wird, bevor ich dies nenne._loaded() - es genügt zu sagen, dass es aufgerufen wird, wenn der ganze Code ausgeführt wird. – olore

3

Haben Sie mit dojo.publish betrachtet() ein Thema zu veröffentlichen, wenn das Widget ist bereit? Oder, wenn der andere Code einen Verweis auf das Widget hat, können Sie eine leere Funktion für die Widget-Instanz aufrufen, wenn Ihr Widget geladen ist (nennen Sie es "geladen"), und dann kann der andere Code, der einen Verweis auf die Instanz hat, Dojo .connect mit der "loaded" -Methode dieser Widget-Instanz, um beim Aufruf der Methode benachrichtigt zu werden.

Verwandte Themen