получить данные из коллекции в метеоре - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь отобразить суммирование всей информации, представленной в форме.

Template.SingleDailylog.helpers({
  personInCharge: ()=>{
    const id = FlowRouter.getParam('id');
    const profile = Dailylog.findOne({_id:id});
    const name = profile.personInCharge;
    return name;
    }
});
<div class="form-group col-md-6">
    <input value="{{personInCharge}}" type="text" class="form-control" placeholder="Name">
    <label for="first">Person In Charge</label>
</div>

Это вставляет информацию, но я все еще получаю сообщение об ошибке:

meteor.js? Hash = 0504f43f667698535416b00eb44eb6f53161cb63: 1048 Исключение в помощнике по шаблону: TypeError: Невозможно прочитать свойство personInCharge undefined at Object.personInCharge (http://localhost:3000/app/app.js?hash=e537a3bd311bc41765fe473a7cd9cf9609139dc9:8544:26) в http://localhost:3000/packages/blaze.js?hash=adc5286b78e5c0f8e7f56a602f77eefb5def6bf1:3051:16 в http://localhost:3000/packages/blaze.js?hash=adc5286b78e5c0f8e7f56a602f77eefb5def6bf1:1715:16 в http://localhost:3000/packages/blaze.js?hash=adc5286b78e5c0f8e7f56a602f77eefb5def6bf1:3103:66 в Function.Template._withTemplateInstanceFunc

Как я получаю сообщение об ошибке, но отображаемые данные верны? Это мешает мне сохранять изменения в данных.

1 Ответ

0 голосов
/ 10 января 2019

Помощник пытается получить доступ к вложенному значению (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>
...