2017-12-29 39 views
0

次のシナリオを考えてみましょう。ここでは子コンポーネントを、RxJs Observableへのサブスクリプションを使用して後で更新されるプロパティに渡しています。RxJSまたはAngular Observable subscribeメソッドにコンテキストが必要なのはなぜですか?

Angularは、匿名関数を送信したり、このコンテキストをバインドしたりしていないときの変更を検出しません。

// Scenario 1 
// Child component IS updated properly 
this.someService.someObservable.subscribe((data) => { 
    this.doSomething(data); 
}) 

// Scenario 2 
// Child component IS updated properly 
this.someService.someObservable.subscribe(this.doSomething.bind(this)) 

// Scenario 3 
// Child component is NOT updated properly 
this.someService.someObservable.subscribe(this.doSomething) 


private doSomething(data) { 
    // this is executed on all the scenarios 
    this.fieldPassedToChildComponent = data; 
} 

変更を反映するために、角度のためのコンテキストをバインドする必要があるのはなぜですか?

+0

doSomething内の 'this'は、グローバルオブジェクトに対して評価されます。 –

+0

シナリオ2は動作しますが、3は動作しません。それは意味があります。なぜなら、「これ」がどのように機能するからですか。 'this'は、あなたがそれを束縛しない限り、関数が呼び出されるときに決まります。 – elclanrs

+0

@elclanrsあなたは正しいです、それを編集しました –

答えて

1

三番目のケースでの問題:this.fieldPassedToChildComponent = data;

// Scenario 3 
// Child component is NOT updated properly 
this.someService.someObservable.subscribe(this.doSomething) 

あなたはthisキーワードは、この行のあなたのdoSomething機能に含まれているものを確認することはできませんということです。それは実際にsubscribeメソッドがあなたのコールバックを呼び出す方法に依存します。

subscribeのソースコードを調べると、コールバックメソッドがどのように呼び出され、したがってthisが設定されているかがわかります。私の推測はundefinedでしょう。しかし、何でもかまいません。したがって、このように使用しないでください。

関連する問題