Sto cercando di imparare angolare 2.angolari rendimenti annotazione 2 @ViewChild undefined
Vorrei accedere ad un componente bambino da un componente principale usando l'annotazione @ViewChild.
Ecco alcune righe di codice:
In BodyContent.ts ho:
import {ViewChild, Component, Injectable} from 'angular2/core';
import {FilterTiles} from '../Components/FilterTiles/FilterTiles';
@Component({
selector: 'ico-body-content'
, templateUrl: 'App/Pages/Filters/BodyContent/BodyContent.html'
, directives: [FilterTiles]
})
export class BodyContent {
@ViewChild(FilterTiles) ft:FilterTiles;
public onClickSidebar(clickedElement: string) {
console.log(this.ft);
var startingFilter = {
title: 'cognomi',
values: [
'griffin'
, 'simpson'
]}
this.ft.tiles.push(startingFilter);
}
}
mentre in FilterTiles.ts:
import {Component} from 'angular2/core';
@Component({
selector: 'ico-filter-tiles'
,templateUrl: 'App/Pages/Filters/Components/FilterTiles/FilterTiles.html'
})
export class FilterTiles {
public tiles = [];
public constructor(){};
}
Infine sua all'e i modelli (come suggerito nei commenti):
BodyContent.html
<div (click)="onClickSidebar()" class="row" style="height:200px; background-color:red;">
<ico-filter-tiles></ico-filter-tiles>
</div>
FilterTiles.html
<h1>Tiles loaded</h1>
<div *ngFor="#tile of tiles" class="col-md-4">
... stuff ...
</div>
Il modello FilterTiles.html è stato caricato correttamente nel tag ico-filter-tiles (infatti sono in grado di vedere l'intestazione).
Nota: la classe BodyContent viene iniettato all'interno di un altro modello (corpo) utilizzando DynamicComponetLoader: dcl.loadAsRoot (BodyContent, '# ico-bodyContent', iniettore):
import {ViewChild, Component, DynamicComponentLoader, Injector} from 'angular2/core';
import {Body} from '../../Layout/Dashboard/Body/Body';
import {BodyContent} from './BodyContent/BodyContent';
@Component({
selector: 'filters'
, templateUrl: 'App/Pages/Filters/Filters.html'
, directives: [Body, Sidebar, Navbar]
})
export class Filters {
constructor(dcl: DynamicComponentLoader, injector: Injector) {
dcl.loadAsRoot(BodyContent, '#ico-bodyContent', injector);
dcl.loadAsRoot(SidebarContent, '#ico-sidebarContent', injector);
}
}
Il problema è che quando provo per scrivere ft nel log della console, ottengo "indefinito" e naturalmente ottengo un'eccezione quando provo a inserire qualcosa all'interno dell'array "tiles" (nessuna proprietà per "undefined").
Un'altra cosa: il componente FilterTiles sembra essere caricato correttamente, dal momento che sono in grado di vedere il modello html per esso.
Qualche suggerimento? Grazie
Sembra corretto. Forse qualcosa con il modello, ma non è incluso nella tua domanda. –
Concordato con Günter. Ho creato un plunkr con il tuo codice e semplici template associati e funziona. Vedi questo link: https://plnkr.co/edit/KpHp5Dlmppzo1LXcutPV?p=preview. Abbiamo bisogno dei modelli ;-) –
'ft' non sarebbe stato impostato nel costruttore, ma in un gestore di eventi click sarebbe già stato impostato. –