什么是流星的领导者榜样?

时间:2014-03-16 03:43:48

标签: javascript meteor handlebars.js

在meteor的排行榜示例中,有一些代码使用this._id来设置" selected_player",用于更新玩家数据库。这是客户端代码:

  Template.leaderboard.players = function () {
    return Players.find({}, {sort: {score: -1, name: 1}});
  };

  Template.leaderboard.selected_name = function () {
    var player = Players.findOne(Session.get("selected_player"));
    return player && player.name;
  };

  Template.player.selected = function () {
    return Session.equals("selected_player", this._id) ? "selected" : '';
  };

  Template.leaderboard.events({
    'click input.inc': function () {
      Players.update(Session.get("selected_player"), {$inc: {score: 5}});
    }
  });

  Template.player.events({
    'click': function () {
      Session.set("selected_player", this._id);
      console.log(this._id);
    }
  });
}

如您所见,this._id永远不会设置(例如this._id = some_id;),那么程序如何获得它?它如何知道选择了哪个玩家?

您可以看到有关该示例的视频,并在此处获取其余代码:Leader Board Example

3 个答案:

答案 0 :(得分:2)

Meteor使用handlebars模板系统(带有一些扩展名)。 Template.player.selected是一个模板助手...其中this等于当前" context"。这意味着this._id等于正在呈现/显示的玩家的_id

有关详细信息,请参阅把手文档的template helpers部分。

答案 1 :(得分:2)

Meteor使用的模板引擎Spacebars的文档说:

  

帮助程序的实现可以访问当前数据上下文this

然后您必须了解数据上下文的工作原理。这包括在:https://www.discovermeteor.com/blog/a-guide-to-meteor-templates-data-contexts

基本上,无论何时使用像#each这样的块标记,它都会创建一个新的数据上下文,其中会对辅助方法和块进行评估。

#each的情况下,数据上下文循环遍历集合的每个对象。

我们还可以通过以下方式进一步观察:

Template.player.events({
  'click': function () {
    Session.set('selectedPlayer', this._id);
    console.log(this._id)
    console.log(this.constructor.toString())
    console.log(Object.getOwnPropertyNames(this))
    console.log(typeof(this._id))
  }
});

当我们点击科学家时,它会在浏览器控制台上输出:

function Object() {
    [native code]
}
Array [ "name", "score", "_id" ]
CdpeDAcEnkdFF3Yu2
string

在此示例中,数据上下文对应于Mongo.Collection.find()的输出,它们是MongoDB文档。 Mongo会自动添加_id

在块标记内,现在可以直接使用当前数据上下文的属性,如下所示:

<span class="name">{{name}}</span>
<span class="score">{{score}}</span>

答案 2 :(得分:0)

这里 this._id 是当前在mongodb中表示项目的对象ID。你想要更新记录。要更新该记录,你应该有一个参考值,所以这里this._id是你的参考值更新记录。