是否可以将session.get()用作Meteor事件映射中的选择器的一部分?

时间:2013-01-21 22:42:22

标签: meteor

我想仅将特定事件添加到符合特定条件的元素,在这种情况下,如果在会话中选择了元素,那么这是一些示例代码:

Template.leaderboard.events({
    'click Session.get("selected_team") .win': function () {
        Teams.update(Session.get("selected_team"), {$inc: {won: 1, score : 5, played: 1}});
    }
});

这将在会话中查找所选团队&然后更新该项目。那有意义吗?有没有更好的方法来实现我想要的目标?

2 个答案:

答案 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传递给查询。