让反应助手不要更新流星模板

时间:2015-05-30 04:28:41

标签: meteor

我正在研究如何关闭模板帮助函数中的反应性。我只希望在最初填充模板时呈现数据,而不是在基础数据发生变化时呈现。

我当前的助手有两个反应变量:一个是Session.get(),另一个是 Collection .findOne()。我已经尝试将Session.get()包装在Tracker.nonreactive()调用中,并在 Collection .findOne()上将reactive选项设置为false,但我还是看到反应行为。

Template.characterSkills.helpers({
  data : function () {
    var characterID = Tracker.nonreactive(function () {
      return Session.get("currentCharacterID");
    });

    if(characterID) {
      var record = Characters.findOne(
        { _id : characterID },
        { 
          reactive : false,
          fields : { skills : 1 } 
        }
      );

      if(record && record.skills)
        return record.skills;
    }
  }
});

我现在一直在努力解决这个问题大约半天。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

您为保留的助手使用名称data。因此,如果您有另一个帮助器或铁路由器路由,其中​​包含data,或者此模板是另一个模板的子模板,它也可能重绘。

尝试将其重命名为其他内容。

答案 1 :(得分:0)

您可以在渲染模板时使用闭包来查找和设置记录,然后在模板助手中返回一个静态对象:

Template.characterSkills.helpers({
  dataItem: function(){
    return record.get();
  }
});

Template.characterSkills.onCreated(function(){
  record.set(Session.get("currentCharacterID"));
});

var record = function(){
  var local = {};
  return {
    set: function(characterId){
      if ( characterID) local = Characters.findOne({_id: characterID},{fields : { skills : 1 }});
      else local = null;
    },
    get: function(){
      return local;
    }
 }();

虽然这甚至感觉太多了。当然有一种更简单的方法。