所以我有一堆模板将使用{{#each game}}
进行迭代,显示以下模板:
<template name="game">
{{#if condition}}
<div class="box">
Page 1
</div>
{{else}}
<div class="box">
Page 2
</div>
{{/if}}
</template>
我想要显示&#34; Page 2&#34;当&#34; Page 3&#34;单击框,所以我有以下内容:
Template.game.events({
'click .box': function(e) {
Session.set("condition", true);
}
});
但我不希望所有其他游戏模板都转换到第2页,只是被点击的那个。我该如何做到这一点?
编辑:更改应仅影响当前用户,而不是所有用户。
答案 0 :(得分:1)
假设您的游戏存储在Meteor.Collection
中,并且condition
是文档中应该反映所有用户的属性,而不仅仅是当前用户,您可以执行以下操作:
Template.game.events({
'click .box': function(event, template) {
Games.update(
{_id: template.data._id},
{$set: {condition: !template.data.condition}}
);
}
});
如果它只影响当前用户,则可以使用特定于模板实例的会话变量,并使用名为condition
的辅助函数返回它:
Template.game.events({
'click .box': function(event, template) {
Session.set("condition-" + template.data._id, true);
}
});
Template.game.condition = function() {
return Session.get("condition-" + this._id);
};
您可以使用本地集合实现类似的功能。
答案 1 :(得分:1)
不要使用Session变量!问题的原因是你有问题,它们等同于旧的全局变量。使用模板的数据,它是本地的,可以用来控制你想要的行为。
对于示例中的模板:
Template.game.created = function() {
this.data.conditionValue = 'something';
this.data.conditionDep = new Deps.Dependency();
};
Template.game.condition = function() {
this.conditionDep.depend();
return this.conditionValue;
};
Template.game.events({
'click .box': function(e, t) {
t.data.conditionValue = 'somethingElse';
t.data.conditionDep.changed();
},
});
答案 2 :(得分:0)
我也觉得使用带有id的会话听起来不是最好的主意,并且发现这个答案似乎比使用会话更好:Using Meteor sessions to toggle templates