1

这是修改后的排行榜:

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助手会重新运行。

在此处输入图像描述

我不希望任何已渲染模板的助手重新运行,除非它们包含更改的反应性数据。有没有办法实现这种行为?

4

2 回答 2

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并且应该可以解决问题。

于 2015-08-13T20:42:21.650 回答
0

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

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

于 2015-08-22T01:52:18.037 回答