我有一个由铁路由器渲染的游戏模板(当你从默认页面进入游戏时)。 当游戏结束时,我希望将玩家路由到默认页面并删除当前游戏模板实例。
为此目的,我在移除的事件上使用钩子进行游戏收集。这允许其他玩家在游戏结束时自动重定向到默认页面:
Tempalte.game.rendered = function () {
var self = this;
var gameId;
//some code here
var game = Games.find({name: Session.get('gameName')});
game.observeChanges({
added: function(id, fields) {
gameId = id;
},
removed: function(id) {
if (gameId === id) { Router.go('/');
alert("Game finished");}
}
});
}
当我完成游戏并创建具有相同名称的新游戏时。警报叫了两次。 还有一个完成/创建=>三个警报。 看起来游戏模板实例仍然保留在后台的某个位置,并监视游戏集合中的更改。
所以问题是如何在进入默认页面时正确删除模板实例? 尝试Blaze.remove(自我)不工作,因为游戏模板没有使用Blaze.render()呈现。 在路由器中我不知道如何获取模板实例的句柄。
答案 0 :(得分:2)
仍然存在导致警报堆叠的模板实例,这是你的observeChanges
游标永远不会停止。
当您在rendered
回调中声明光标以在模板实例为destroyed
时停止观察时,您需要保存对它的引用。
Template.game.rendered=function(){
// ...
this.observeCursor=game.observeChanges(...);
};
Template.game.destroyed=function(){
this.observeCursor.stop();
};