Le contexte de la “ce” dans le Météore de modèle de gestionnaires d'événements (à l'aide de Guidon pour le templating)
Une petite question sur le contexte des gestionnaires d'événements pour les modèles dans Meteor (le Guidon).
- Dans la section de la Documentation sur les instances de modèle (http://docs.meteor.com/#template_inst) il est mentionné que "Modèle, les objets sont trouvés que la valeur de cette dans le, rendus, et détruit modèle de rappels et comme un argument de gestionnaires d'événements"
- Dans la section Modèles ( http://docs.meteor.com/#templates ), il est dit "Enfin, vous pouvez utiliser un des événements de la déclaration sur une fonction de modèle pour créer un tableau des gestionnaires d'événements. Le format est documenté à Cartes d'Événement. La cet argument pour le gestionnaire d'événement sera l' contexte de données de l'élément qui a déclenché l'événement."
Bien, ce n'est que partiellement vrai. Nous allons utiliser un exemple tiré de la documentation:
<template name="scores">
{{#each player}}
{{> playerScore}}
{{/each}}
</template>
<template name="playerScore">
<div>{{name}}: {{score}}
<span class="givePoints">Give points</span>
</div>
</template
Template.playerScore.events({
'click .givePoints': function () {
Users.update({_id: this._id}, {$inc: {score: 2}});
});
Ici de la "ce" contexte de la " cliquez sur .givePoints' gestionnaire d'événement est en effet le modèle de l'instance de playerScore. Nous allons modifier le code html:
<template name="scores">
<span class="click-me">Y U NO click me?<span>
{{#each player}}
{{> playerScore}}
{{/each}}
</template>
<template name="playerScore">
<div>{{name}}: {{score}}
<span class="givePoints">Give points</span>
</div>
</template>
... et ajouter un gestionnaire d'événements pour .cliquez sur-moi sur les scores modèle:
Template.scores.events({
'click .click-me': function () {
console.log(this);
}
});
Maintenant, si vous cliquez sur la durée, qu'obtenez-vous connecté? L'objet de la Fenêtre! Qu'ai-je espérer obtenir? L'objet de modèle! Ou peut-être le contexte de données, mais il est ni. Cependant, à l'intérieur de l'rappels (par exemple, Modèle.les scores.rendus = function(){ ... }) le contexte de la "ce" est toujours le modèle de l'instance.
Je suppose que ma question serait plutôt: est-ce quelque chose à faire avec
- d'un bug dans le Guidon, Météore, ou quelque part entre les deux?
- légèrement incomplète de la documentation sur les modèles?
- moi complètement mauvaise interprétation de la documentation ou de ne pas comprendre quelque chose de fondamental
de Météore, ou le Guidon?
Merci!
- C'est une bonne question. J'ai toujours des données accessibles dans les événements à l'aide de
function(event,template)
, et ensuite à traverstemplate.data
. - Souhaite que je pourrais upvote deux fois
- vous pouvez marquer la question en tant que favori, comme je l'ai fait 😉
Vous devez vous connecter pour publier un commentaire.
Cette vidéo explique les concepts:
http://www.eventedmind.com/posts/meteor-spark-data-annotation-and-data-contexts.
La réponse directe à votre question:
La thisArg à l'intérieur d'un gestionnaire d'événement devrait point à un contexte de données. Mais parfois, le contexte de données est
undefined
. Lorsque vous utilisez leFunction.prototype.call(thisArg, ...)
en JavaScript, si le thisArg est pas défini (par exemple, un dataContext est pas défini), le navigateur devra définirthis
égal à la fenêtre. Ainsi, les docs ne sont pas mal en soi, mais le code de gestion des événements n'est pas la protection contre la possibilité d'un contexte de données défini. Je devine qui sera fixé dans l'ordre court.Donc, ce qui produit un contexte de données pour un modèle? Normalement à la racine de votre modèle n'aurez même pas un contexte de données. En d'autres termes, le Modèle de la fonction est appelée sans objet. Mais si vous utilisez la
{{#with
bloc aide ou de la{{#each
itérateur, un contexte de données sera créé pour chaque élément dans la liste, ou dans le cas de la avec aide de l'objet.Exemple:
window
si le contexte de données n'est pas défini a été corrigé dans la dernière version de Meteor. Donc, maintenantthis
à l'intérieur d'un gestionnaire d'événement renvoie toujours à un objet, soit le contexte de données ou un objet vide si il n'y a pas de contexte de données.Le premier paramètre de la fonction est le cas. Vous pouvez utiliser la cible de l'événement pour récupérer votre élément.