【问题标题】:What is this._id in meteor's leader-board example?流星排行榜示例中的 this._id 是什么?
【发布时间】:2014-04-21 09:05:27
【问题描述】:

在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

【问题讨论】:

    标签: javascript meteor handlebars.js


    【解决方案1】:

    Meteor 使用handlebars 模板系统(带有一些扩展)。 Template.player.selected 是一个模板助手...其中this 等于当前的“上下文”。这意味着this._id 等于正在渲染/显示的玩家的_id

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

    【讨论】:

      【解决方案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 文档。 _id 由 Mongo 自动添加。

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-11-25
          • 1970-01-01
          • 1970-01-01
          • 2017-08-04
          • 1970-01-01
          • 1970-01-01
          • 2014-02-02
          • 1970-01-01
          相关资源
          最近更新 更多