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

时间:2013-10-28 01:33:42

标签: meteor

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

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

类似的东西:

<button type="button" question="{{../_id}}" class="btn btn-default answer">
{{this}} {{#with ../this}}{{this._id}}{{/with}}
</button>

用于在模板中显示父问题ID,但如何正确执行此操作。我们的目标是拥有一个抓住事件的功能,并将答案与&#34; right_answer&#34;为了平等,如果有效,请给你一点意见。谢谢!

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

{{each}}
    {{#with ../this}}
        <button type="button" question="{{../_id}}" class="btn btn-default answer">X</span></button>     
    {{/with}}
    {{this}}
{{/each}}

2 个答案:

答案 0 :(得分:5)

我通常做这样的事情:

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,
         });
    });
}

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

<template name="myTemplate">
    {{#each answers}}
        <button data-question="questionId">...</button>
    {{/each}}
</template>

BTW:请注意,根据标准,在question元素上使用html属性不正确。您应始终在自定义代码前加data-

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

Template.myTemplate.events({
   'click button': function (event, template) {
       // ...
   },
});

然后在事件回调中,您可以访问this,它代表呈现button元素的上下文,以及template.data,它是附加到模板的数据上下文实例,所以实际上这或多或少是你的“父语境”。

修改

请注意,新的模板引擎(即blaze)允许我们在模板中使用点表示法,因此不再需要上述方法,{{../_id}}完全正常。

答案 1 :(得分:5)

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