Es wird versucht, den @Input
Wert der Komponente in constructor
oder abzurufen ngOnInit
. Aber es kommt wie undefined
immer.
Ich habe den Heldenplunker mit aktualisiert console.log
, um das Problem zu zeigen (Beta-Winkel).
http://plnkr.co/edit/dseNM7OTFi1VNG2Z4Oj5?p=preview
export class HeroDetailComponent implements OnInit {
constructor(){
console.log('hero', this.hero)
}
public hero: Hero;
ngOnInit() {
console.log('hero', this.hero)
}
}
Was mache ich hier falsch?
Antworten:
Der Grund, warum Sie undefiniert werden,
ngOnInit
ist, dass Sie an dem Punkt, an dem die Komponente initialisiert wird, noch keinHero
Objekt übergeben habenZu diesem Zeitpunkt
selectedHero
hat Ihr Wert keinen WertAppComponent
und ruft erst auf, wenn das Klickereignis in der Liste dieonSelect
Methode aufruftBearbeiten: Tut mir leid, dass ich kein Update angeboten habe. Wenn Sie fügen Sie ein
ngIf
zumy-hero-detail
Sie sollten die Initialisierung der
my-hero-detail
Komponente verzögern und die Konsolenausgabe sehen. Dies wird nicht jedoch wieder ausgegeben , wenn die ausgewählten Helden ändert.quelle
Dies liegt daran, dass die Helden asynchron geladen werden. Wenn die Ansicht also anfänglich gerendert wird, ist der ausgewählte Held undefiniert. Nachdem eine Auswahl getroffen wurde, wird der Held mit einem definierten Wert in die Detailansicht übergeben.
Sie sehen im Grunde nur den onInit-Aufruf basierend auf dem ursprünglichen Wert (undefiniert).
Wenn Sie möchten, dass nach jeder Auswahl etwas Ähnliches ausgeführt wird, können Sie es folgendermaßen ändern:
quelle
Ich habe das gleiche Verhalten festgestellt, als ich den Wert der Eingabeeigenschaft in nicht definiert habe
ngOnInit
. Die Aussage*ngIf="selectedHero"
im HTML-Code hat mich nicht zufrieden gestellt. Darüber hinaus war die Verwendung der AntwortAfterViewChecked
von @ THG keine gute Lösung für mich, da sie regelmäßig aufgerufen wird und auch die Warnung auslöst,ExpressionChangedAfterItHasBeenCheckedError
wenn ich eine Variable ändern möchte (ich wollte keine Problemumgehung verwendensetTimeout
). Dies ist meine Lösung für diese Art von Problem:Ich hoffe es hilft später jemandem.
quelle
In der ngOninit-Methode verwenden,
quelle