Контекст данных Meteor Blaze становится неопределенным - PullRequest
0 голосов
/ 25 мая 2018

У меня есть шаблон блэйса, как это:

{{>jobsheetsTable companyId=companyId}}

В JS для шаблона у меня есть функция onCreated, как это ...

Template.jobsheetsTable.onCreated(function(){
  const instance = this;
  instance.companyId = new ReactiveVar();
  console.log(instance, instance.data, instance.data.companyId);
  if(instance.data.companyId){
    instance.companyId.set(instance.data.companyId);
  }
}

Проблема в том, что вв выражении console.log я заметил что-то странное ...

instance правильно выводит экземпляр с объектом data, а companyId instance.data, однако, возвращает {companyId: undefined}.

Я нигде не меняю instance.data, и функция, передаваемая в этот шаблон, не меняет companyId.

Обновление: использование метеора 1.6.1.

1 Ответ

0 голосов
/ 26 мая 2018

Обратный вызов onCreated запускается только один раз при создании шаблона, поэтому вы получаете те данные, которые предоставляются для первоначального создания (вероятно, с вашим атрибутом, установленным в undefined).

Этовероятно, что контекст данных изменяется после первоначального рендеринга, и это не вызывает функцию.поскольку шаблон не создается заново.

Если вы уверены, что хотите отслеживать контекст данных в обратном вызове onCreated, вам необходимо установить реактивную зависимость от него, используя Template.currentData() реактивный источник данных.Поскольку он должен быть внутри реактивного контекста, чтобы его можно было повторно запускать при изменении данных, вам нужно будет создать его, и удобный способ сделать это - через this.autorun(), который останавливает вычисления для вас, когда шаблонуничтожен.

Template.jobsheetsTable.onCreated(function(){
  this.companyId = new ReactiveVar();
  this.autorun(() => { // creates a reactive computation
    const data = Template.currentData(); // creates a reactive dependency
    console.log('data context', data);
    if(data.companyId){
      this.companyId.set(data.companyId);
    }
  })
});

Приведенный выше код содержит блок autorun, который будет повторно запускаться при изменении контекста данных.

...