ngOnChanges nicht feuern, wenn das Attribut geändert durch Beobachtbare/subscrption
Ich versuche zu tun, etwas nach einem Observable
/subscribe
abgeschlossen. Ich bin das ändern eines Input
Eigenschaft in der subscribe( onNext )
Methode, aber ngOnChanges
nie ausgelöst.
Was sollte ich anders machen?
import { Component, EventEmitter,
OnInit, AfterViewInit, OnChanges, SimpleChanges,
Input, Output
} from '@angular/core';
@Component({
templateUrl: 'myTemplate.html'
, providers: [ NamesService ]
})
export class MyPage {
@Input() names: any[];
constructor( public namesSvc: NamesService) {}
ngOnInit() {
this.getNames$()
}
getNames$() : void {
this.nameService.get().subscribe(
(result)=>{
this.names = result;
console.log(`getNames$, names=${this.names}`);
//I could doSomething() here, but it doesn't seem like the correct place
//doSomething()
}
, error => this.errorMessage = <any>error
)
}
ngOnChanges(changes: SimpleChanges) : void {
//changes.prop contains the old and the new value...
console.warn(`>>> ngOnChanges triggered`)
if (changes["names"]) {
console.warn(`>>> ngOnChanges, names=${changes["names"]}`)
this.doSomething()
}
}
doSomething(){
console.log("doing something");
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist das "as designed"
ngOnChanges()
wird nur aufgerufen, wenn der change-detection-updates eine Bindung an eine@Input()
. Wenn die Eingabe geändert wird zwingend von irgendwo, dann ist es nicht genannt.Nur machen
names
eine getter - /setter-für code, der ausgeführt werden jedes mal, wenn die Eigenschaft aktualisiert wird.Wie gesagt von Günter ist es nicht ganz so funktioniert, wie, die von meinem Verständnis... Bei der Verwendung von Observablen können Sie veranlassen, eine änderung manuell mit der
Observable.next()
Funktion. Der trick hier ist, dass Sie haben, um eineObservable
Sie von Ihrem service - diese kann getan werden, etwa so:Dann abonnieren Sie Sie, wie viel Sie bereits getan haben, und wenn die
.next()
läuft es löst eine Veränderung auf der.subscribe()
Methode.Ich würde empfehlen, diese Spaltung aus der get-Methode, aber Sie könnten möglich Ihr eigenes
onNameUpdate()
Methode, die Rückkehr der observable-array - oder so ähnlich.