2009-07-14 12 views
3

J'ai une classe:correct « this » dans le bouton jQuery rappel

function RustEditor() { 

this.init = function() { 

    var saveButton = this.container.find("button.saveButton"); 
    saveButton.click(function(){this.save();}); 

}; 
... 

Lorsque je clique sur le bouton, il se plaint que this.save n'est pas une fonction. C'est parce que "ceci" ne se réfère pas à l'instance de RustEditor ici, mais au bouton. Quelle variable puis-je utiliser dans cette fermeture de rappel pour pointer vers l'instance de RustEditor? Je pourrais utiliser rust.editor (c'est un nom dans la portée globale) mais c'est un code malodorant.

Répondre

12

La pratique courante consiste à enfermer la valeur this comme ceci:

function RustEditor() { 

this.init = function() { 
    var self = this; 

    var saveButton = this.container.find("button.saveButton"); 
    saveButton.click(function(){self.save();}); 

}; 

Mise à jour avec la suggestion de tvanfosson: this prend le rebond lorsque le gestionnaire d'événements est appelé et donc vous devez saisir la référence à la classe au moment où l'objet est créé avec une variable qui conservera cette référence dans la fermeture.

+0

Cela améliorerait votre réponse si vous expliquiez pourquoi cela doit se produire, à savoir, _this_ se rebondit lorsque le gestionnaire d'événements est appelé et donc vous devez capturer la référence à la classe au moment où l'objet est créé avec un variable qui conservera cette référence dans la fermeture. – tvanfosson

+0

@tvanfosson - Merci pour votre suggestion. J'espère que cela ne vous dérange pas que je vous ai cité mot pour mot. Vous l'avez dit beaucoup mieux que moi – seth

1

Dans RustEditor(), vous pouvez d'abord copier une référence au bouton et l'utiliser.

Questions connexes