不一致的模板实例 - 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" 我的问题,虽然我不明白为什么 created
和 rendered
的模板实例不同,但这是我的解决方法:
- 向名为
lastUpdated
的 Games
集合添加了新属性
- 添加了包 Meteor Collection Hooks:
meteor add matb33:collection-hooks
- 添加了收集挂钩 (1).
- 已更新
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}});
}
我有一个 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" 我的问题,虽然我不明白为什么 created
和 rendered
的模板实例不同,但这是我的解决方法:
- 向名为
lastUpdated
的 - 添加了包 Meteor Collection Hooks:
meteor add matb33:collection-hooks
- 添加了收集挂钩 (1).
- 已更新
gameType
助手 (2).
Games
集合添加了新属性
(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}});
}