2017-12-29 10 views
0

Betrachten Sie die folgenden Szenarien, in denen ich ein untergeordnetes Element übergebe eine Eigenschaft, die später mithilfe eines Abonnements für ein RxJs Observable aktualisiert wird.Warum benötigt RxJS oder Angular Observable Subscribe-Methode Kontext?

Angular erkennt keine Änderungen, wenn keine anonyme Funktion gesendet wird oder der Kontext nicht angezeigt wird.

// 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; 
} 

Warum müssen wir den Kontext binden, für Winkel die Änderungen in Kraft treten?

+0

Wenn nicht, wird das 'this' in' doSomething' zum globalen Objekt ausgewertet. –

+0

Sie meinen Szenario 2 funktioniert, aber 3 nicht? Das macht Sinn, weil "das" funktioniert. 'this' wird entschieden, wenn die Funktion aufgerufen wird, es sei denn, Sie binden sie. – elclanrs

+0

@elclanrs Sie haben Recht, bearbeitet es –

Antwort

1

Das Problem mit dritten Fall:

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

ist, dass man nicht sicher sein kann, was this Stichwort auf dieser Linie in Ihrer doSomething Funktion enthält: this.fieldPassedToChildComponent = data;. Es hängt wirklich davon ab, wie subscribe Methode Ihren Rückruf aufruft.

Wenn Sie im Quellcode von subscribe suchen, können Sie herausfinden, wie die Callback-Methode aufgerufen wird und daher this festgelegt ist. Meine Schätzung wäre undefined. Aber könnte alles sein. Deshalb benutze diesen Weg nicht.