如何确保模板助手有数据?
How to ensure template helper has data?
我有一个 select 框,它在每个选项上运行一个小方法来确定 'selected' 是什么:
<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";
}
},
在客户端...当我直接更新数据库时,它最终会在下拉列表中适当地加载和响应更新。我的问题是我在加载时多次收到以下错误:
Exception in template helper: TypeError: Cannot read property 'currentSoftMargin' of undefined
虽然有效,但这个错误似乎不对,这是代码中唯一使用 currentSoftMargin
的地方。几乎就像模板助手 determineDefaultSelect
比数据库调用和产品异步调用更快 运行 ......也许吧?我可以阻止这种情况吗?
当帮助程序在订阅您的数据之前运行时,您会收到此错误 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
},
在您的模板中使用 {{#if Template.subscriptionsReady}}{{/if}}
以确保准备好所有需要的数据。
我有一个 select 框,它在每个选项上运行一个小方法来确定 'selected' 是什么:
<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";
}
},
在客户端...当我直接更新数据库时,它最终会在下拉列表中适当地加载和响应更新。我的问题是我在加载时多次收到以下错误:
Exception in template helper: TypeError: Cannot read property 'currentSoftMargin' of undefined
虽然有效,但这个错误似乎不对,这是代码中唯一使用 currentSoftMargin
的地方。几乎就像模板助手 determineDefaultSelect
比数据库调用和产品异步调用更快 运行 ......也许吧?我可以阻止这种情况吗?
当帮助程序在订阅您的数据之前运行时,您会收到此错误 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
},
在您的模板中使用 {{#if Template.subscriptionsReady}}{{/if}}
以确保准备好所有需要的数据。