如何破坏模板实例?

时间:2014-09-19 10:20:48

标签: meteor iron-router

我有一个由铁路由器渲染的游戏模板(当你从默认页面进入游戏时)。 当游戏结束时,我希望将玩家路由到默认页面并删除当前游戏模板实例。

为此目的,我在移除的事件上使用钩子进行游戏收集。这允许其他玩家在游戏结束时自动重定向到默认页面:

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()呈现。 在路由器中我不知道如何获取模板实例的句柄。

1 个答案:

答案 0 :(得分:2)

仍然存在导致警报堆叠的模板实例,这是你的observeChanges游标永远不会停止。

当您在rendered回调中声明光标以在模板实例为destroyed时停止观察时,您需要保存对它的引用。

Template.game.rendered=function(){
  // ...
  this.observeCursor=game.observeChanges(...);
};

Template.game.destroyed=function(){
  this.observeCursor.stop();
};