J'essaie d'apprendre Angular 2.
Je souhaite accéder à un composant enfant à partir d'un composant parent à l'aide de l' annotation @ViewChild .
Voici quelques lignes de code:
Dans BodyContent.ts, j'ai:
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);
}
}
dans 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(){};
}
Enfin voici les modèles (comme suggéré dans les commentaires):
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>
Le modèle FilterTiles.html est correctement chargé dans la balise ico-filter-tiles (en effet, je peux voir l'en-tête).
Remarque: la classe BodyContent est injectée dans un autre modèle (Body) à l'aide de 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);
}
}
Le problème est que lorsque j'essaie d'écrire ft
dans le journal de la console, j'obtiens undefined
, et bien sûr, j'obtiens une exception lorsque j'essaie de pousser quelque chose à l'intérieur du tableau «tuiles»: «pas de tuiles de propriété pour« non défini »» .
Une dernière chose: le composant FilterTiles semble être correctement chargé, car je peux voir le modèle html correspondant.
Toute suggestion? Merci
ft
ne serait pas défini dans le constructeur, mais dans un gestionnaire d'événements click, il serait déjà défini.
loadAsRoot
, qui a un problème connu avec la détection des modifications. Assurez-vous simplement d'utiliser loadNextToLocation
ou loadIntoLocation
.
loadAsRoot
. Une fois que j'ai remplacé loadIntoLocation
le problème a été résolu. Si vous faites votre commentaire comme réponse, je peux le marquer comme accepté