Meteor Blaze数据上下文变得不确定

时间:2018-05-25 15:10:13

标签: meteor meteor-blaze

我有一个像这样的火焰模板:

{{>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

更新:使用meteor 1.6.1。

1 个答案:

答案 0 :(得分:2)

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块,只要数据上下文发生变化,它就会重新运行。