在Meteor中,如何仅在模板的一个实例上更新属性?

时间:2013-02-08 02:03:20

标签: meteor

如果我在Meteor中有一个{{#each}}绑定,我想在#each中只更新一个模板实例的属性。我该怎么办?我已经尝试在事件映射中的“模板”对象上设置一个值,但这似乎不是被动的。我也尝试绑定到Session属性,但这会导致每个实例更新而不仅仅是我想要的...

例如:

{{#each dates}}
    {{> dateTemplate}}
{{/each}}

<template name="dateTemplate">
    {{date}}
    <span style="color: red;">{{errorMsg}}</span> <--- how do i update errorMsg?
</template>

Template.dateTemplate.events({
    'click': function(event, template) {
        template.errorMsg = 'not valid'; <--- this doesn't do anything
    }
});

编辑解决以下问题:

Template.dateTemplate.events({
    'click': function(event, template) {
        template.errorMsg = function() { return 'not valid';} <--- this also doesn't do anything
    }
});

3 个答案:

答案 0 :(得分:1)

您不必为此使用把手,因为它不需要反应来传递消息,反应变量最适合数据库数据,或者由其他客户端通过无线更新的数据。

你可以使用JQuery(默认包含)来更新它,它也可以有点发烧友:

<template name="dateTemplate">
    {{date}}
    <span style="color: red;display: none" class="errorMessage"></span>
</template>

Template.dateTemplate.events({
    'click': function(event, template) {
        $(template.find('.errorMessage')).html('Your Error Message').slideDown();
    }
});

我已对其进行了编辑,因此默认情况下会隐藏错误,并使用动画向下滑动

答案 1 :(得分:1)

我正在尝试通过将不同的反应对象传递给模板的每个实例来处理此问题。然后模板可以绑定到反应对象(每个实例都是唯一的),我们没有任何额外的样板。

最终看起来像这样:

初始渲染:

Template.firstTemplateWithPoll(ContextProvider.getContext())
Template.secondTemplateWithPoll(ContextProvider.getContext())
// (I actually pass getContext an identifier so I always get the same context for the same template)

JS:

Template.poll.events = {
    'click .yes' : function() {
        this.reactive.set('selection', 'yes');
    },

    'click .no' : function() {
        this.reactive.set('selection', 'no');
    }
};

Template.poll.selection = function(arg) {
    return this.reactive.get('selection');
}

模板:

<template name="poll">
    <blockquote>
        <p>
            Your selection on this poll is {{selection}}
        </p>
    </blockquote>
    <button class='yes'>YES</button>
    <button class='no'>NO</button>
</template>

答案 2 :(得分:0)

template.errorMsg应该是一个返回错误的函数。

Template.dateTemplate.events({
    'click': function(event, template) {
        template.errorMsg = function() { return 'not valid'; };
    }
});