当限制更改时,如何防止重新运行游标项帮助程序?

How can you prevent cursor item helpers from being rerun when the limit changes?

这是修改后的排行榜:

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 帮助程序。

我不希望任何已呈现模板的助手重新运行,除非它们包含变化的反应数据。有什么办法可以实现这种行为吗?

我认为在更新反应数据时您无法避免助手成为 运行。

然而,克服运行 的一种方法可能是使用 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 即可。

ReactiveVars 中缓存模板助手结果并将助手代码移动到模板自动运行:

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