如何确保模板助手有数据?

时间:2017-09-07 18:45:01

标签: asynchronous meteor meteor-blaze

我有一个选择框,在每个选项上运行一个小方法,以确定选择了什么'是:

      <label for="soft-due-date-controller">Soft Due Days:</label>
      <select class="form-control" id="soft-due-date-controller">
        <option value="0" {{determineDefaultSelect '0'}}>0</option>
        <option value="1" {{determineDefaultSelect '1'}}>1</option>
        <option value="2" {{determineDefaultSelect '2'}}>2</option>
        <option value="3" {{determineDefaultSelect '3'}}>3</option>
        <option value="4" {{determineDefaultSelect '4'}}>4</option>
        <option value="5" {{determineDefaultSelect '5'}}>5</option>
        <option value="6" {{determineDefaultSelect '6'}}>6</option>
        <option value="7" {{determineDefaultSelect '7'}}>7</option>
        <option value="8" {{determineDefaultSelect '8'}}>8</option>
        <option value="9" {{determineDefaultSelect '9'}}>9</option>
        <option value="10" {{determineDefaultSelect '10'}}>10</option>
      </select>

以下是方法:

determineDefaultSelect: function(optionText){
    let savedSoftSchedueDays = SoftDueDates.find().fetch()[0].currentSoftMargin;
    if(optionText == savedSoftSchedueDays){
        return "selected";
    }
},

在客户端...当我直接更新数据库时,它最终会在下拉列表中正确加载并响应更新。我的问题是我在加载时多次加载时出现以下错误:

  

模板助手中的异常:TypeError:无法读取属性&#39; currentSoftMargin&#39;未定义的

虽然它有效但是这个错误似乎不对,这是代码中唯一使用currentSoftMargin的地方。几乎像模板助手determineDefaultSelect的运行速度比db调用可能发生得快,产品异步调用...也许?我可以阻止这个吗?

2 个答案:

答案 0 :(得分:1)

在订阅数据ready()之前帮助程序运行时,您收到此错误。您可以等待订阅准备好呈现模板(在此期间呈现微调器)或防止运行时错误:

determineDefaultSelect: function(optionText){
  const doc = SoftDueDates.findOne(); // equivalent to .find().fetch()[0];
  const savedSoftScheduleDays = doc && doc.currentSoftMargin; // will not error
  return (optionText == savedSoftScheduleDays) ? "selected" : ""; // shorthand
},

答案 1 :(得分:1)

在模板中使用{{#if Template.subscriptionsReady}}{{/if}}以确保所需的所有数据都已准备就绪。