2016-07-08 8 views
0

変更された@Inputは、親コンポーネントのhttpリクエストで更新された後、子コンポーネントで表示されないようです。子供が親を呼び出すと子コンポーネントの親変数を更新する方法httpリクエストを持つ

これは一例です:

親だから、

import { ChildComp } from './child.component'; 

@Component({ 
    template: <child [counter]="a" [updateCounter]="updateCounter"></child>, 
    directives: [ChildComp] 
}) 

export class ParentComponent { 
    public a = 1; 
    public CallBack:Function; 

    constructor(private _http:Http) {} 

    public ngOnInit() { 
     this.CallBack = this.updateCounter.bind(this); 
    } 

    public updateCounter() { 
     this._http.get('/newcounter/').subscribe(
      data => { 
       // update counter 
       this.a = JSON.parse(data['_body']); 
      }, 
      error => {}, 
      () => console.log('updated counter') 
     ); 

    } 
} 

子供

@Component({ 
    selector: 'child', 
    template: ` 
     <button class="btn btn-default" (click)="updateCounter()"></button> 
     <p>counter: {{ counter }}</p> 
    `, 
    inputs: ["counter", "updateCounter"] 
}) 

export class ChildComponent { 
    public counter; 
    public updateCounter:Function; 

    constructor() {} 
} 

httpリクエストがない場合、これは動作します。しかし、私は要求があると、子ビューはカウンタを更新しません。

アイデア?私は何が欠けていますか?

public updateCounter() { 
    let that = this; 
    this._http.get('/newcounter/').subscribe(
     data => { 
      // update counter 
      that.a = JSON.parse(data['_body']); 
     }, 
     error => {}, 
     () => console.log('updated counter') 
    ); 

} 

thisを使用した:私は今持っている

一つのハックは、このようなあなたの親コンポーネントのupdateCounter機能を改正updateCounter

答えて

1

に呼び出した後、カウンタ500ミリ秒を更新するために、子コンポーネントにsetTimeoutにあります約束はあなたのクラスをもう参照しません。だから、thisへの参照を別の変数に保持し、代わりにその変数を使用する必要があります。

+0

私の最初の試みだったが、それが機能しなかったこと。そのような1つの状態の後ろに、すべてのボタンがクリックされるたびに前のカウンタが表示されます。 – Brian

+0

updateCounterメソッドを参照としてChildComponentに渡して、更新をトリガーします。ドキュメントによると、あなたのソリューションの代わりにEventEmitterを使用することを提案したいと思います。公式のドキュメントでサンプルを探す:https://angular.io/docs/ts/latest/guide/template-syntax.html#!#inputs-outputs – Matt

0

updateCounter関数が子コンポーネントから呼び出され、そのコンテキストthisChildComponentのインスタンスを参照しています。

は、以下のことを試してみてください。

export class ParentComponent { 
    ... 
    public ngOnInit() { 
    this.updateCounter = this.updateCounter.bind(this); 
    } 
関連する問題