Wie werden beim Schreiben von Angular 2.0-Komponenten Standardwerte für Eigenschaften festgelegt?
Zum Beispiel - ich mag Satz foo
zu 'bar'
standardmäßig, aber die Bindung könnte sofort lösen zu 'baz'
. Wie spielt sich das in den Lifecycle-Hooks ab?
@Component({
selector: 'foo-component'
})
export class FooComponent {
@Input()
foo: string = 'bar';
@Input()
zalgo: string;
ngOnChanges(changes){
console.log(this.foo);
console.log(changes.foo ? changes.foo.previousValue : undefined);
console.log(changes.foo ? changes.foo.currentValue : undefined);
}
}
Angesichts der folgenden Vorlagen erwarte ich folgende Werte. Liege ich falsch?
<foo-component [foo] = 'baz'></foo-component>
An der Konsole angemeldet:
'baz'
'bar'
'baz'
<foo-component [zalgo] = 'released'></foo-component>
An der Konsole angemeldet:
'bar'
undefined
undefined
angular
typescript
Bryan Rayner
quelle
quelle
Antworten:
Das ist ein interessantes Thema. Sie können mit zwei Lifecycle-Hooks herumspielen, um herauszufinden, wie es funktioniert:
ngOnChanges
undngOnInit
.Wenn Sie den Standardwert auf diesen Wert setzen,
Input
wird er grundsätzlich nur verwendet, wenn für diese Komponente kein Wert eingeht. Und der interessante Teil wird geändert, bevor die Komponente initialisiert wird.Angenommen, wir haben solche Komponenten mit zwei Lifecycle-Hooks und einer Eigenschaft, von der sie stammen
input
.Situation 1
In HTML enthaltene Komponente ohne definierten
property
WertAls Ergebnis sehen wir in der Konsole:
Init default
Das heißt,
onChange
wurde nicht ausgelöst. Init wurde ausgelöst und derproperty
Wert istdefault
wie erwartet.Situation 2
In HTML enthaltene Komponente mit festgelegter Eigenschaft
<cmp [property]="'new value'"></cmp>
Als Ergebnis sehen wir in der Konsole:
Changed
new value
Object {}
Init
new value
Und dieser ist interessant. Zum einen war getriggerten
onChange
Haken, die gefasstenproperty
zunew value
, und früheren Wert war leer Objekt ! Und erst nachdem dieseronInit
Hook mit neuem Wert von ausgelöst wurdeproperty
.quelle
@Input
Standardwerten. @slicepan hat einen Link zu den Dokumenten für den Komponentenlebenszyklus, aber ich habe keinen Standardwert in der Dokumentation gesehen.@Input() someProperty = 'someValue';
Hier ist die beste Lösung dafür. (WINKEL 7,8, 9)
Adressierungslösung : Zum Festlegen eines Standardwerts für die Variable @Input . Wenn an diese Eingabevariable kein Wert übergeben wird, wird der Standardwert verwendet .
Ich habe eine Lösung für diese Art von ähnlicher Frage bereitgestellt. Die vollständige Lösung finden Sie hier
quelle