2009-08-11 6 views
1

J'implémente une structure de classe dans jQuery, mais j'ai des problèmes lorsque j'essaie d'appeler certaines de mes fonctions.Comment puis-je conserver le contrôle du mot-clé this lors de l'extension de prototypes dans jQuery?

Voici comment la structure est la configuration:

MyClass = function(name) { 
    this.init(name); 
} 
$.extend(MyClass.prototype, { 
    init: function(theName) { 
     this.myFunction(); // works 
     $('.myclass').each(function(){ 
      this.myFunction(); // doesn't work 
     }); 
    }, 
    myFunction = function(){} 
}); 

Le problème que je vais avoir est que lorsque je tente d'appeler un de mes fonctions (par exemple, myFunction()) à l'intérieur d'un bloc jQuery (comme le each() construire ci-dessus), j'obtiens l'erreur "myFunction() is not a function".

Je pense que cela a quelque chose à voir avec le mot-clé this qui change sa signification dans le bloc jQuery, mais je ne suis pas sûr. Toute aide serait appréciée!

+0

@Bergi cette question est donc un double d'une question qui a été publié plus de 4 ans après? Agréable. –

+0

Oui, cette question de 2013 est une référence canonique, expliquant le problème que vous avez également eu et toutes les solutions (sic!) À elle largement. S'il vous plaît ne vous sentez pas offensé, vous n'avez rien fait de mal :-) Je ne fais que diriger les futurs lecteurs à la canonique. – Bergi

+0

Je ne suis pas offensé, et je comprends vraiment! ;) Il suce juste que la copie autour de cette fonctionnalité donne l'impression que l'OP posait négligemment une question qui avait déjà une réponse - "Cette question a déjà une réponse ici:" "Cette question a déjà été posée et a déjà une réponse. " Juste un peu bizarre. –

Répondre

4

Vous devez affecter this à une autre variable, en raison du fonctionnement de la portée.

MyClass = function(name) { 
    this.init(name); 
} 
$.extend(MyClass.prototype, { 
    init: function(theName) { 
     this.myFunction(); // works 
     var that = this; 
     $('.myclass').each(function(){ 
       this.myFunction(); // doesn't work 
       that.myFunction(); // should work 
     }); 
    }, 
    myFunction = function(){} 
}); 
+0

Merci beaucoup! –

0
MyClass = function(name) { 
    this.init(name); 
} 
$.extend(MyClass.prototype, { 
    init: function(theName) { 
     this.myFunction(); // works 
     temp = this; 
     $('.myclass').each(function(){ 
       temp.myFunction(); // works 
     }); 
    }, 
    myFunction = function(){} 
}); 

essayer. :)

+0

Vous savez .. votre exemple dit que 'temp.myFunction();' ne fonctionne pas ... –

+0

Lorsque j'ai copié le code OP, j'ai oublié de supprimer le commentaire. Mon erreur. – Salty

0

La fonction .each() modifie le contexte de this (comme n'importe quelle fonction en JavaScript).

Vous devez faire quelque chose comme ceci:

MyClass = function(name) { 
    this.init(name); 
} 
$.extend(MyClass.prototype, { 
    init: function(theName) { 
     this.myFunction(); // works 
     var myClass = this; 
     $('.myclass').each(function(){ 
       myClass.myFunction(); // doesn't work 
     }); 
    }, 
    myFunction = function(){} 
}); 
+1

Vous savez .. votre exemple dit que myClass.myFunction(); 'ne fonctionne pas ... –

Questions connexes