【问题标题】:Meteor Blaze Data Context becomes undefinedMeteor Blaze 数据上下文变得未定义
【发布时间】:2018-11-05 00:46:21
【问题描述】:

我有一个像这样的 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

更新:使用流星 1.6.1。

【问题讨论】:

  • 如何在父模板实例中设置companyId 值?
  • 本质上是Meteor.user().roles.company。在控制台中调用它时。它返回正确的值。

标签: meteor meteor-blaze


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2018-08-26
    • 2015-06-20
    • 2016-05-02
    • 2021-12-28
    • 2016-03-10
    • 2017-07-02
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多