当限制发生变化时,如何防止光标项助手重新运行?

时间:2015-08-13 19:57:15

标签: meteor meteor-blaze meteor-tracker

以下是经过修改的排行榜:

http://meteorpad.com/pad/CgEG3uYBZDceTERXA/Leaderboard

我为players光标添加了限制,并显示scorePlusOne而不是score

Template.leaderboard.helpers({
  players: function () {
    return Players.find({}, { sort: { score: -1, name: 1 } , limit: Session.get('limit')});

Template.player.helpers({
  scorePlusOne: function() {
    console.log('scorePlusOne',this.name);
    return this.score + 1;

当我将限制从1增加到2时,第一个播放器模板不会被重新渲染,但重新运行scorePlusOne帮助器。

enter image description here

我不希望任何已呈现模板的帮助程序重新运行,除非它们包含更改的被动数据。有没有办法实现这种行为?

2 个答案:

答案 0 :(得分:1)

我不认为你可以避免在更新被动数据时运行帮助程序。

然而,一种溢出这种方法的方法可能是使用tracker.autorun()函数将标志包装为true并允许帮助程序运行或不运行。由于反应元素,模板重新渲染后,它将切换为true。

看起来像这样:

Template.leaderboard.rendered = function() {
  this.autorun(function(){ 
     flag = true 
  });
};

你的助手看起来像这样:

Template.leaderboard.helpers({
  players: function () {
    if (flag===true){
     return Players.find({}, { sort: { score: -1, name: 1 } , limit:            
     Session.get('limit')});
    }
  },
  selectedName: function () {
   if (flag===true){
    var player = Players.findOne(Session.get("selectedPlayer"));
    return player && player.name;
    }
  }
});

每次进行更改时,只需设置flag = false即可。

答案 1 :(得分:0)

缓存模板帮助程序导致ReactiveVar s并将帮助程序代码移动到模板autoruns:

https://github.com/meteor/meteor/issues/4960#issuecomment-132715347