Ich versuche Angular 2 zu lernen.
Ich möchte mit der @ ViewChild- Annotation von einer übergeordneten Komponente aus auf eine untergeordnete Komponente zugreifen .
Hier einige Codezeilen:
In BodyContent.ts habe ich:
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);
}
}
während 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(){};
}
Zum Schluss hier die Vorlagen (wie in den Kommentaren vorgeschlagen):
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>
Die Vorlage FilterTiles.html wurde korrekt in das Tag ico-filter-tiles geladen (tatsächlich kann ich den Header sehen).
Hinweis: Die BodyContent-Klasse wird mit DynamicComponetLoader in eine andere Vorlage (Body) eingefügt: 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);
}
}
Das Problem ist, dass ich beim Versuch, ftin das Konsolenprotokoll zu schreiben undefined, eine Ausnahme erhalte , wenn ich versuche, etwas in das Array "tiles" zu verschieben: 'no property tiles for "undefined"' .
Noch etwas: Die FilterTiles-Komponente scheint korrekt geladen zu sein, da ich die HTML-Vorlage dafür sehen kann.
Irgendein Vorschlag? Vielen Dank
ftwürde nicht im Konstruktor festgelegt werden, aber in einem Click-Event-Handler wäre es bereits festgelegt.
loadAsRoot, was ein bekanntes Problem mit der Änderungserkennung hat. Nur um sicherzugehen, versuchen Sie es mit loadNextToLocationoder loadIntoLocation.
loadAsRoot. Einmal habe ich durch loadIntoLocationdas Problem ersetzt wurde gelöst. Wenn Sie Ihren Kommentar als Antwort