我想仅将特定事件添加到符合特定条件的元素,在这种情况下,如果在会话中选择了元素,那么这是一些示例代码:
Template.leaderboard.events({
'click Session.get("selected_team") .win': function () {
Teams.update(Session.get("selected_team"), {$inc: {won: 1, score : 5, played: 1}});
}
});
这将在会话中查找所选团队&然后更新该项目。那有意义吗?有没有更好的方法来实现我想要的目标?
答案 0 :(得分:0)
在排行榜示例中,所选择的玩家将获得一个"选择"的css类,所以您需要做的就是:
Template.player.events({
'click .selected': function () {
console.log('clicked on the selected player:', this.name);
}
});
您可以对可能有条件地触发事件的其他元素使用相同的模式:根据条件为其分配特定的css类(或不分配)。
如果您不想通过模板向元素添加css类(无论出于何种原因),那么最好只是在Javascript中检查您的条件:
Template.player.events({
'click': function () {
if (Session.get("selected_player") === this._id) {
console.log('clicked on the selected player:', this.name);
}
}
});
答案 1 :(得分:-1)
由于您已将Session.get语句作为字符串的一部分包含在内,因此它将无法按您编写的方式工作。这样的事情可能有用:
Template.leaderboard.events({
'click ' + Session.get("selected_team") + ' .win': function() {}
});
......但我不推荐它。相反,你应该做这样的事情:
Template.leaderboard.events({
'click .team': function() {
Teams.update(this.id, {...});
}
});
Template.leaderboard.teams = function() {
return Teams.find({});
}
在您看来:
<template name="leaderboard">
{{#each teams}}
<div class="team">{{team}}</div>
{{/each}}
</template>
每个.team
仍然会在排行榜模板中记住其上下文,在事件处理程序中称为this
,因此您只需将this.id
传递给查询。