在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
答案 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是你的参考值更新记录。