我有一个帮手,我想要访问不同集合的属性。
Template.notification.helpers({
username: function () {
game = Games.findOne({_id: this.gameId}, {fields: {players:1}});
console.log(game) // output is correct
}
})
如果我记录下来,它会产生我预期的结果:
Object {players: Array[2], _id: "qF3skjX2755BYcr8p"}
但是,如果我在我的辅助函数中尝试使用/到达此属性,我会得到一个未定义的错误。
Template.notification.helpers({
username: function () {
game = Games.findOne({_id: this.gameId}, {fields: {players:1}});
console.log(game._id) // error;
console.log(game.players) // error
}
})
输出:
Exception from Deps recompute function: TypeError: Cannot read property 'players' of undefined
为什么会这样?
答案 0 :(得分:1)
这是因为当Meteor initiall在您的Web浏览器上加载时,所有的html和js都准备就绪,但数据还没有准备好。
如果您尝试检查console.log(game)
,则可能是null
。它仅在页面加载时执行此操作。如果在下载完所有数据后加载模板,则不会出现此问题。
当数据到达时,username
助手会重新运行新数据。
同时你只需要处理这个例外:
var game = Games.findOne({_id: this.gameId}, {fields: {players:1}});
if(!game) return null;