2009-07-13 8 views
1

Je voudrais ajouter une fonction "onload" à ma classe Dojo personnalisée afin qu'elle puisse appeler des fonctions qui s'inscrivent à l'événement - quelque chose comme myWidget.addOnLoad (...)Comment ajouter "onload" à ma classe Dojo?

Ma classe n'est pas un Dijit c'est une classe simple qui utilise dojo.declare. Lors de la création, plusieurs fonctions sont appelées (xhr, etc) pour initialiser la classe et j'ai besoin de la possibilité de notifier d'autres fonctions javascript que le widget est chargé &.

Répondre

1

As jburke already pointed out Dojo vous facilite la tâche: dojo.connect est tout ce dont vous avez besoin. Voici un exemple:

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 

Et puis exécutez juste a.loaded() après que vous avez terminé avec le chargement a.

+0

Maine, merci pour l'exemple clair. Je vais toujours utiliser addOnLoaded comme point d'entrée, mais j'appelle simplement dojo.connect() à la place. – olore

0

Donc je suis allé de l'avant & fondamentalement copié les fonctions de Dojo addOnLoad & l'a ajouté à ma classe. Cela semble fonctionner. J'ai regardé faire un pub/sub ou un dojo.connect, mais j'ai l'impression que c'était la solution la plus propre et la plus reconnaissable.

Voici les bits nécessaires pour obtenir ça va, encore une fois dépouillées de dojo.js et branché dans ma classe:

_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

Je ne vois pas comment cela fonctionnerait. Appelez-vous _loaded en dehors de cet exemple de code quelque part? – seth

+0

Si vous avez raison, j'ai épargné le gros morceau de code qui s'exécute avant que j'appelle this.loaded() - il suffit de dire qu'il est appelé quand tout ce code est exécuté. – olore

3

Avez-vous pensé à utiliser dojo.publish() pour publier un sujet lorsque le widget est prêt? Ou, si l'autre code a une référence au widget, vous pouvez appeler une fonction vide sur l'instance du widget lorsque votre widget est chargé (appelez-le "chargé"), puis l'autre code qui a une référence à l'instance peut dojo .connect à la méthode "loaded" de cette instance de widget pour être averti lorsque la méthode est appelée.

Questions connexes