2011-03-02 2 views
0

Cher tous, J'utilise dojo.declare pour créer des classes en JavaScript. Dans l'une des méthodes, j'ai une requête AJAX. Dans la méthode de chargement de cette requête, j'ai besoin d'exécuter certaines méthodes. Ces méthodes sont en fait des méthodes de la classe qui a été créée en utilisant dojo.declare. J'ai essayé d'exécuter la méthode en utilisant this. Mais cela m'a donné une méthode non trouvée erreur. J'ai donc utilisé dojo.hitch(this,testMethod) pour l'invoquer. Cela a bien fonctionné. Maintenant, le problème est que j'ai beaucoup d'autres méthodes à l'intérieur testMethod() qui appelle en interne d'autres méthodes de ma classe JavaScript. C'est vraiment pénible d'avoir dojo.hitch() partout. Y a-t-il du travail pour ça?Appel de la méthode JavaScript dans une portée particulière

dojo.declare("TestClass",null,{ 

    getData:function(url){ 
    dojo.xhrGet({ 
     url:url, 
     load: function (response){ 
     dojo.hitch(scope of the current object,testMethod(response))  
     }, 
     error:function(){ 

     } 
    }); 
    }, 
    testMethod:function(response){ 
    //calls testMethod2. I think I can use dojo.hitch(this,testMethod3) to call it. 
    //but I wanted to avoid doing it every time. 
    }, 
    testMethod2:function(){ 
    //calls testMethod3 
    }, 
    testMethod3:function(){ 
    //can call other methods. 
    } 
    }); 

Répondre

2

Il semble que la portée d'exécution a été perdu dans ce code:

load: function (response){ 
     dojo.hitch(this,testMethod(response)) 
     }, 

J'ai fait des petits changements dans votre code. Maintenant, cela devrait fonctionner correctement.

dojo.declare("TestClass",null,{ 

     getData:function(url){ 
     dojo.xhrGet({ 
      url:url, 
      load: dojo.hitch(this,this.testMethod), 
      error:function(){ 

      } 
     }); 
     }, 
     testMethod:function(response){ 
      this.testMethod2(); 
     }, 
     testMethod2:function(){ 
      this.testMethod3(); 
     }, 
     testMethod3:function(){ 
     //can call other methods. 
     } 
     }); 
+0

Salut Ander, Merci pour la réponse. J'ai une question. Dans la méthode load, "this" fait référence à l'objet window. Mais il n'y a pas de testMethod pour l'objet window. Pourriez-vous s'il vous plaît expliquer la raison pour laquelle cela devrait fonctionner? – Steves

+0

Pourquoi pensez-vous que "ceci" fait référence à l'objet fenêtre? Il doit faire référence à l'instance de la classe "TestClass". – Andrei

+0

dojo.xhrGet() est exécuté dans une étendue de fenêtre. Je l'ai également vérifié dans Firebug, en y définissant un point d'arrêt. – Steves

0

Essayez de faire comme ceci:

dojo.xhrGet({ 
    url:url, 
    load: dojo.hitch(this, "testMethod"), 
    error:function(){ 

    } 
}); 

votre façon de travailler aussi bien, mais il vous permet d'économiser de quelques octets et est tout simplement plus propre à utiliser le nom de la méthode comme une chaîne. Hitch passera automatiquement les arguments pour vous.

2

Ceci est un problème de contexte typique. Vous passez une fonction non-codée en tant que propriété d'un hachage de configuration, qui est passée en argument à dojo.xhrGet. Dojo.hitch est exactement la bonne construction pour ajouter un contexte à une fonction. Une autre façon est d'utiliser simplement une fermeture. Y at-il une raison pour laquelle vous ne pouvez pas faire:

var me = this; 
dojo.xhrGet({ 
    url:url, 
    load: function(response) { 
     me.testMethod(response); 
    } 
}); 
Questions connexes