la méthode addEventListener et la portée de cette
J'ai un tiers objet flash qui je peux manipuler grâce à une API javascript. Je suis tryind d'écouter un évènement sur cet objet, et puis le feu de l'événement à l'intérieur de mon opposer à la bulle de l'événement. Il m'arrive d'être en utilisant EXT Js, mais je ne pense pas que sa important ici.
Exemple de code
this.chart.addEventListener('create', function() {
this.fireEvent('created');
}, false)
Mon problème est que 'ce' intérieur de la fonction anonyme fait référence à l'objet qui a déclenché l'événement plutôt que mon objet que je veux mettre le feu à un événement.
Ses encore un autre problème de portée. Merci d'avance pour toute aide.
OriginalL'auteur Jonnio | 2009-11-26
Vous devez vous connecter pour publier un commentaire.
Ceci est typique de l'approche à ce problème:-
var self = this;
. La création d'une fonction, puis de l'exécuter, tout en passantthis
que le paramètre semble un peu à la mer - le code est un peu plus long aussi 😉Oui je le fais souvent que, lorsque le code existe dans une petite contexte d'exécution. Cependant, le ci-dessus est l'approche standard, qui travaille dans une grande variété de scénarios. Le champ d'application de la
self
identificateur est limitée uniquement à la fermeture, il n'y a pas de danger que le code suivant est susceptible de modifier la valeur contenue en elle avant que l'événement se déclenche. Ce n'est pas vrai de lavar self = this;
approche.OriginalL'auteur AnthonyWJones
Ce qui concerne la création d'une variable externe avant de référencement de 'cette' objet.
Par exemple:
that
ouself
(bien que je ne pense pas que ce dernier est une excellente idée queself
a établi — mais inutile — sens existant en JavaScript).OK cela fonctionne. De l'intérêt est-il une autre façon autre que la définition d'une variable. Par exemple à l'aide de la fermeture?
Je préfère
self
.self
est exposée parwindow
une référence à lui-même. Je suis très heureux de réutiliser l'identifiant dans d'autres étendues. Il me semble pour effectuer le bon sens et ne rentrera pas en conflit avec ce que cela signifie quandself
arrive à la fenêtre.OriginalL'auteur nandokakimoto
Tandis que les autres réponses accomplir ce que vous avez besoin, ils ne travaillent pas de la manière la plus efficace (évolutive), parce qu'ils ne sont pas en fin de compte de dissocier l'objet de vue (
this.chart
) à partir de ce point de vue de la logique (fireEvent()
). Dans les applications MVC, à la vue de ces "décisions" résident dans un contrôleur. Le contrôleur "contrôles" vues et doit contenir toutes les Api de la vue peut accéder.Dans votre exemple,
this
est le contrôleur, et c'est très bien (cela signifie que vous êtes en train d'ajouter à vos auditeurs à la bonne place). Tout ce que vous devez faire est de lier le gestionnaire de la portée de la chose qu'on doit faire de la "manipulation" - dans votre cas:this
:Ce que les autres réponses sur cette page ont fait est fait de sorte que votre vue devient son propre contrôleur, mais seulement lors de la manipulation de "créer" des événements, par l'affectation d'un renvoi temporaire pour le "contrôleur" à l'aide de
var self = this
. Encore une fois, cela fonctionne bien, mais il ne fonctionne pas bien à l'échelle dans des applications basées sur les événements, et il n'a pas vraiment de sens que si vous avez beaucoup d'événements à gérer..bind()
est un ECMAScript 5 mise en œuvre. Si il est nécessaire de travailler en même anciens navigateurs, une bonne façon de le faire est décrit ici (utiliserfunctions
et.call()
): https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bind.fireEvent()
) est définie dans la vue, mais le contrôleur appelle en tant que de besoin. Cela pourrait vous permettre de ne pas utiliser.bind()
ou une auto-référence, mais rendrait votre gestionnaire de très unmodular; et votre demande de devenir très volumineux.OriginalL'auteur Benny