不一致的模板实例 - Meteor

Inconsistent template instance - Meteor

我有一个 game 模板,它包含在 table 中,如下所示:

<table class="games-table">
   {{#each publisher}}
   <tr id="{{_id}}" class="publisher-row">
      <td class="publisher">
         {{> publisherTemplate}}
      </td>
      <td class="shooter">
         {{#each gamesType '1'}}
         {{> game}}
         {{/each}}
      </td>
      <td class="adventure">
         {{#each gamesType '2'}}
         {{> game}}
         {{/each}}
      </td>
   </tr>
   {{/each}}
</table>

gamesType 助手只是 returns 适当的游戏(status 文档中的属性,如“1”和“2”)。

现在的目标是在 table 数据字段之间移动游戏。当只有一个游戏与 gameType 关联时(在 td 中)一切正常。但是当有多个的时候,模板实例好像不一致。

这是我的模板回调:

Template.game.created = function() {
    console.log("created: " + this.data._id);
};

Template.game.destroyed = function() {
    console.log("destroyed: " + this.data._id);
};

Template.game.rendered = function() {
    console.log("rendered: " + this.data._id);
};

第一次渲染时,控制台输出是这样的(对于具有相同 gameType ("2") 的两个游戏):

created: HN7FL8wKtfxDLzrJM
rendered: HN7FL8wKtfxDLzrJM
created: g2EGnaGW9SP6yhbT7
rendered: g2EGnaGW9SP6yhbT7

这绝对没问题。现在我将 status 更新为“1”,控制台输出是这样的(这也绝对没问题):

created: HN7FL8wKtfxDLzrJM
destroyed: HN7FL8wKtfxDLzrJM
rendered: HN7FL8wKtfxDLzrJM

但是现在,当我将 status 更新回“2”时,游戏再次出现在正确的列中,但请查看控制台输出:

destroyed: HN7FL8wKtfxDLzrJM
created: HN7FL8wKtfxDLzrJM
rendered: g2EGnaGW9SP6yhbT7 

我不知道为什么会这样,我真的很沮丧,因为我需要正确的 _id 作为我在 rendered 回调中的逻辑。我试过这个解决方法:

Template.game.created = function() {
    console.log("created: " + this.data._id);
    this.currGame = this.data;
};

… 然后在 rendered 回调中使用 this.currGame 而不是 this.data 访问它。这种方法的问题在于,这不适用于同一列中的其他游戏(因为 this.currGame 处于陈旧状态)。

如有任何帮助,我们将不胜感激!

编辑: 这是 gameType 助手:

gameType: function(type) {
   return Games.find({publisherId: this._id, status: type});
}

这是我更新 status:

的方式
Games.update({_id: "HN7FL8wKtfxDLzrJM"}, {$set: {status: "2"}});

好的,我 "solved" 我的问题,虽然我不明白为什么 createdrendered 的模板实例不同,但这是我的解决方法:

  1. 向名为 lastUpdated
  2. Games 集合添加了新属性
  3. 添加了包 Meteor Collection Hooksmeteor add matb33:collection-hooks
  4. 添加了收集挂钩 (1).
  5. 已更新 gameType 助手 (2).

(1):

Games.before.update(function (userId, doc, fieldNames, modifier, options) {
        modifier.$set = modifier.$set || {};
        modifier.$set.lastUpdated = new Date();
});

(2):

gameType: function(type) {
    return Games.find({publisherId: this._id, status: type}, {sort: {lastUpdated: -1}});
}