Estoy tratando de aprender Angular 2.
Me gustaría acceder a un componente secundario desde un componente primario utilizando la Anotación @ViewChild .
Aquí algunas líneas de código:
En BodyContent.ts tengo:
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);
}
}
mientras que en 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 aquí las plantillas (como se sugiere en los comentarios):
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>
La plantilla FilterTiles.html está cargada correctamente en la etiqueta ico-filter-tiles (de hecho, puedo ver el encabezado).
Nota: la clase BodyContent se inyecta dentro de otra plantilla (Body) usando DynamicComponetLoader: dcl.loadAsRoot (BodyContent, '# ico-bodyContent', inyector):
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);
}
}
El problema es que cuando trato de escribir ft
en el registro de la consola, obtengo undefined
, y por supuesto obtengo una excepción cuando intento insertar algo dentro de la matriz de "mosaicos": 'no hay mosaicos de propiedades para "indefinido"' .
Una cosa más: el componente FilterTiles parece estar cargado correctamente, ya que puedo ver la plantilla html para él.
¿Cualquier sugerencia? Gracias
ft
no se establecería en el constructor, pero en un controlador de eventos click ya estaría configurado.
loadAsRoot
, que tiene un problema conocido con la detección de cambios. Solo para asegurarte de usar loadNextToLocation
o loadIntoLocation
.
loadAsRoot
. Una vez que lo reemplacé con loadIntoLocation
el problema se resolvió. Si haces tu comentario como respuesta, puedo marcarlo como aceptado