Sto cercando di imparare Angular 2.
Vorrei accedere a un componente figlio da un componente padre 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(){};
}
Finalmente ecco i template (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 è caricato correttamente nel tag ico-filter-tiles (in effetti sono in grado di vedere l'intestazione).
Nota: la classe BodyContent viene iniettata all'interno di un altro modello (Body) utilizzando DynamicComponetLoader: dcl.loadAsRoot (BodyContent, '# ico-bodyContent', injector):
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 a scrivere ft
nel registro della console, ottengo undefined
, e ovviamente ottengo un'eccezione quando provo a inserire qualcosa all'interno dell'array "tiles": "nessuna proprietà tile per" undefined "" .
Ancora una cosa: il componente FilterTiles sembra essere caricato correttamente, dato che sono in grado di vedere il modello html per esso.
Qualche suggerimento? Grazie
ft
non sarebbe impostato nel costruttore, ma in un gestore eventi click sarebbe già impostato.
loadAsRoot
, che ha un problema noto con il rilevamento delle modifiche. Solo per assicurarsi di provare a usare loadNextToLocation
o loadIntoLocation
.
loadAsRoot
. Una volta sostituito con loadIntoLocation
il problema è stato risolto. Se fai il tuo commento come risposta posso contrassegnarlo come accettato