Ao escrever componentes do Angular 2.0, como definir os valores padrão das propriedades?
Por exemplo - desejo definir foo
como 'bar'
padrão, mas a ligação pode resolver imediatamente para 'baz'
. Como isso funciona nos ganchos do ciclo de vida?
@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);
}
}
Dados os modelos a seguir, é o que eu espero que os valores sejam. Estou errado?
<foo-component [foo] = 'baz'></foo-component>
Registrado no console:
'baz'
'bar'
'baz'
<foo-component [zalgo] = 'released'></foo-component>
Registrado no console:
'bar'
undefined
undefined
angular
typescript
Bryan Rayner
fonte
fonte
Respostas:
Esse é um assunto interessante. Você pode brincar com dois ganchos de ciclo de vida para descobrir como funciona:
ngOnChanges
engOnInit
.Basicamente, quando você define o valor padrão para
Input
isso, ele será usado apenas no caso de não haver nenhum valor vindo desse componente. E a parte interessante é que será alterado antes que o componente seja inicializado.Digamos que temos esses componentes com dois ganchos de ciclo de vida e uma propriedade proveniente de
input
.Situação 1
Componente incluso em html sem
property
valor definidoComo resultado, veremos no console:
Init default
Isso significa que
onChange
não foi acionado. Init foi acionado e oproperty
valor édefault
o esperado.Situação 2
Componente incluído em html com propriedade definida
<cmp [property]="'new value'"></cmp>
Como resultado, veremos no console:
Changed
new value
Object {}
Init
new value
E este é interessante. Em primeiro lugar foi desencadeada
onChange
gancho, que setadoproperty
paranew value
, eo valor anterior era objeto vazio ! E só depois que oonInit
gancho foi acionado com o novo valor deproperty
.fonte
@Input
ter valores padrão. @slicepan tem um link para os documentos do ciclo de vida do componente, mas não vi um valor padrão usado na documentação.@Input() someProperty = 'someValue';
Aqui está a melhor solução para isso. (ANGULAR 7,8,9)
Solução de endereçamento : Para definir um valor padrão para a variável @Input . Se nenhum valor for passado para essa variável de entrada, ela assumirá o valor padrão .
Eu forneci solução para esse tipo de questão semelhante. Você pode encontrar a solução completa aqui
fonte