oninit ngonchanges lifehook after angular

angular - ngonchanges - ngoninit



La propiedad @Input no está definida en onInit de angular 2 (4)

Intentando obtener el valor @Input del componente en constructor o ngOnInit. Pero viene como "indefinido" todo el tiempo.

Actualicé el hero plunker con console.log para mostrar el problema (beta angular). 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) } }

¿Qué estoy haciendo mal aquí?


En el uso del método ngOninit,

ngOnInit() { if(this.hero) console.log(''hero'', this.hero); }


Encontré el mismo comportamiento cuando tengo indefinido el valor de la propiedad de entrada en ngOnInit . La declaración *ngIf="selectedHero" en código html no me satisfizo. Además, usar AfterViewChecked de la respuesta de @ THG no fue una buena solución para mí, porque llama periódicamente y también causa la advertencia ExpressionChangedAfterItHasBeenCheckedError cuando quiero cambiar alguna variable (no quería usar la solución setTimeout ). Esta es mi solución para este tipo de problema:

export class MyComponent implements OnChanges { @Input() myVariable: any; ngOnChanges(changes: SimpleChanges) { if (changes[''myVariable'']) { let variableChange = changes[''myVariable'']; //do something with variableChange.currentValue } } }

Espero que ayude a alguien más tarde.


Esto se debe a que los héroes se cargan de forma asíncrona, por lo que cuando la vista se muestra inicialmente, el héroe seleccionado no está definido. Pero luego de hacer una selección, el héroe pasa a la vista de detalles con un valor definido.

Básicamente solo está viendo la llamada onInit basada en el valor original (indefinido).

Si desea ejecutar algo similar después de cada selección, puede modificarlo así:

export class HeroDetailComponent implements AfterViewChecked { constructor(){ console.log(''hero'', this.hero) } public hero: Hero; ngAfterViewChecked() { console.log(''hero'', this.hero) } }


La razón por la que no está definido en ngOnInit es porque en el punto donde se inicializa el componente, no ha pasado realmente un objeto Hero

<my-hero-detail [hero]="selectedHero"></my-hero-detail>

En este punto, selectedHero no tiene ningún valor en su AppComponent y no lo hace hasta que el evento de clic en la lista llame al método onSelect

Editar: Lo siento, me di cuenta de que en realidad no ofrecí una solución. Si agrega un ngIf a my-hero-detail

<my-hero-detail *ngIf="selectedHero" [hero]="selectedHero"></my-hero-detail>

debería retrasar la inicialización del componente my-hero-detail y debería ver la salida de la consola. Sin embargo, esto no volverá a aparecer cuando cambie el héroe seleccionado.