Estou tentando aprender Angular 2.
Gostaria de acessar um componente filho de um componente pai usando a Anotação @ViewChild .
Aqui estão algumas linhas de código:
Em BodyContent.ts eu tenho:
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);
}
}
enquanto em 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, aqui os modelos (como sugerido nos comentários):
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>
O modelo FilterTiles.html foi carregado corretamente na tag ico-filter-tiles (na verdade, eu consigo ver o cabeçalho).
Nota: a classe BodyContent é injetada dentro de outro modelo (Body) usando DynamicComponetLoader: dcl.loadAsRoot (BodyContent, '# ico-bodyContent', injetor):
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);
}
}
O problema é que, quando tento gravar ftno log do console, recebo undefinede, é claro, recebo uma exceção ao tentar enviar algo para dentro da matriz "tiles": 'nenhum bloco de propriedades para "indefinido"' .
Mais uma coisa: o componente FilterTiles parece estar carregado corretamente, pois consigo ver o modelo html.
Alguma sugestão? obrigado
ftnão seria definido no construtor, mas em um manipulador de eventos de clique já seria definido.
loadAsRoot, que tem um problema conhecido com a detecção de alterações. Apenas para ter certeza de tentar usar loadNextToLocationou loadIntoLocation.
loadAsRoot. Uma vez que eu substituí com loadIntoLocationo problema foi resolvido. Se você fizer seu comentário como resposta, posso marcá-lo como aceito.