我有一个像这样的火焰模板:
{{>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。
答案 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
块,只要数据上下文发生变化,它就会重新运行。