Comment définir les valeurs par défaut pour les propriétés des composants Angular 2?

Lors de l'écriture de composants Angular 2.0, comment définit-on les valeurs par défaut pour les propriétés?

Par exemple - je veux définir foo à ' bar 'par défaut, mais la liaison peut immédiatement se résoudre à 'baz'. Comment cela se joue-t-il dans les crochets de cycle de vie?

@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);
    }
}

Compte tenu des modèles suivants, c'est ce que j'attends des valeurs. Suis-je tort?

<foo-component [foo] = 'baz'></foo-component>

Logged to console: 
'baz'
'bar'
'baz'

<foo-component [zalgo] = 'released'></foo-component>

Logged to console: 
'bar'
undefined
undefined
36
demandé sur Bryan Rayner 2016-03-18 00:23:43

1 réponses

C'est un sujet intéressant. Vous pouvez jouer avec deux crochets de cycle de vie pour comprendre comment cela fonctionne: ngOnChanges et ngOnInit.

Fondamentalement, lorsque vous définissez la valeur par défaut sur Input, cela signifie qu'elle sera utilisée uniquement au cas où il n'y aurait pas de valeur sur ce composant. Et la partie intéressante sera modifiée avant que le composant ne soit initialisé.

Disons que nous avons de tels composants avec deux crochets de cycle de vie et une propriété provenant de input.

@Component({
  selector: 'cmp',
})
export class Login implements OnChanges, OnInit {
  @Input() property: string = 'default';

  ngOnChanges(changes) {
    console.log('Changed', changes.property.currentValue, changes.property.previousValue);
  }

  ngOnInit() {
    console.log('Init', this.property);
  }

}

Situation 1

composant inclus dans html sans valeur property définie

Comme résultat, nous verrons dans la console: Init default

C'est dire que onChange n'a pas été déclenché. Init a été déclenché et la valeur property est {[9] } comme prévu.

Situation 2

Composant inclus dans le html avec sertie de propriété <cmp [property]="'new value'"></cmp>

En conséquence, nous verrons dans la console:

Changed new value Object {}

Init new value

Et celui-ci est intéressant. Tout d'abord été déclenchée onChange crochet, qui programmés property à new value, et la valeur précédente était objet vide! Et seulement après que onInit hook a été déclenché avec une nouvelle valeur de property.

46
répondu Mikki 2016-08-30 05:57:33