Помощник пытается получить доступ к вложенному значению (personInCharge
) из объекта, который еще не существует (profile
)
Если вы хотите предотвратить возникновение этого исключения, у вас есть два варианта:
Вариант 1 - запретить доступ к неопределенным объектам внутри помощника
Например, вы можете заключить каждую переменную в оператор if следующим образом:
Template.SingleDailylog.helpers({
personInCharge: ()=>{
const id, profile, name;
id = FlowRouter.getParam('id');
if (id) {
profile = Dailylog.findOne({_id:id});
}
if (profile && profile.personInCharge) { // I always check nested things this way
name = profile.personInCharge;
}
if (name) {
return name;
}
});
В этом случае, если id
и profile
и profile.personInCharge
не определены, код в блоках if не будет выполняться, и поэтому он не будет пытаться получить доступ к вложенным переменным, которые не существуют еще при создании шаблона, который не даст помощнику генерировать исключения.
Вариант 2 - запретить вызов помощника
Вы также можете использовать реактивную переменную, чтобы указать, готова ли подписка, и запретить шаблону вызывать помощника, если нет.
// const subscription = // ... используйте это, если вы используете глобальную подписку
Template.SingleDailylog.onCreated (function () {
const instance = this;
instance.state = new ReactiveDict();
instance.autorun(() => {
const subscription = //... use this for Template level subscription
if (subscription.ready()) {
instance.state.set('loadComplete', true);
}
});
})
Затем добавьте помощника для loadComplete
:
Template.SingleDailylog.helpers({
personInCharge() {
const id = FlowRouter.getParam('id');
const profile = Dailylog.findOne({_id:id});
const name = profile.personInCharge;
return name;
},
loadComplete () {
return Template.instance().state.get('loadComplete');
}
});
и используйте его для вызова помощника personInCharge
, только если loadComplete
истинно:
<div class="form-group col-md-6">
{{#if loadComplete}}
<input value="{{personInCharge}}" type="text" class="form-control" placeholder="Name">
<label for="first">Person In Charge</label>
{{else}}
<div>Loading....</div>
{{/if}}
</div>