bugfix> meteor > 投稿

このようなブレイズテンプレートがあります。

{{>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 件
  • ザ・ onCreated  コールバックは、テンプレートの作成ごとに1回のみ実行されるため、取得するデータは、最初の作成に提供されるデータです(おそらく、属性が 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 が含まれています  データコンテキストが変更されるたびに再実行されるブロック。

あなたの答え