如何在事件中获取Meteor中的父数据上下文

Bre*_*evy 7 meteor

我正在研究一个简单的流星闪卡应用程序.每个问题都有一组:text,right_answer,wrong_answers.

将答案连接成一个数组并进行洗牌,然后模板列出一个问题和可能的答案.当用户单击答案时,如何从事件中获取JS中的父数据上下文.

就像是:

<button type="button" question="{{../_id}}" class="btn btn-default answer">
{{this}} {{#with ../this}}{{this._id}}{{/with}}
</button>
Run Code Online (Sandbox Code Playgroud)

用于在模板中显示父问题ID,但我该如何正确地执行此操作.目标是拥有一个抓取事件的函数,并将"right_answer"的答案与相等性进行比较,如果有效,则给出一个点.谢谢!

最终提出了这个解决方案,但我真的不喜欢它或认为它是正确的:

{{each}}
    {{#with ../this}}
        <button type="button" question="{{../_id}}" class="btn btn-default answer">X</span></button>     
    {{/with}}
    {{this}}
{{/each}}
Run Code Online (Sandbox Code Playgroud)

Tom*_*cik 6

我通常做这样的事情:

Template.myTemplate.answers = function () {
    var self = this;
    // assume that this.answers is a list of possible answers
    return _.map(this.answers, function (answer) {
         return _.extend(answer, {
             questionId: self._id,
         });
    });
}
Run Code Online (Sandbox Code Playgroud)

那么你很高兴去你的模板,你可以做以下事情:

<template name="myTemplate">
    {{#each answers}}
        <button data-question="questionId">...</button>
    {{/each}}
</template>
Run Code Online (Sandbox Code Playgroud)

顺便说一句:注意,根据标准question,html元素的使用属性是不正确的.您应始终为自定义标记添加前缀data-.

另请注意,如果您将事件附加到模板,请执行以下操作:

Template.myTemplate.events({
   'click button': function (event, template) {
       // ...
   },
});
Run Code Online (Sandbox Code Playgroud)

然后在你有权访问的事件回调中this,它代表了button呈现元素的上下文,以及template.data附加到模板实例的数据上下文,因此实际上这或多或少是你的"父上下文".

编辑

请注意,新的模板引擎,即blaze允许我们在模板中使用点符号,因此不再需要上面描述的方法,并且{{../_id}}完全没问题.


Lor*_*ren 5

您可以访问Template.parentData(n)事件处理程序:http: //docs.meteor.com/#/full/template_parentdata