2017-08-28 1 views
2

Ich habe eine Hierarchie der Komponenten:Angular 4 - Wie bekomme ich Zugriff auf verschachtelte Komponenten innerhalb einer Vorlage?

App 
| 
Child 
| 
Input 

Die Komponente „Child“ nimmt eine Vorlage aus es Eltern ist so:

<my-child> 
    <ng-template> 
     <my-input></my-input> 
     <span>asdasdas</span> 
     <my-input></my-input> 
     <my-input></my-input> 
    </ng-template>  
</my-child> 

Wie Sie in der Vorlage sehen können, gibt es eine Reihe von Eingabekomponenten. Jetzt Ich möchte einen Zugriff auf die Liste der <my-input> Komponenten von der untergeordneten Komponente erhalten. Was ich jetzt versuchte, war das @ ContentChildren/@ ViewChildren, aber es scheint nicht zu funktionieren. Der Code der Kinder Komponente:

@Component({ 
    selector: 'my-child', 
    providers: [], 
    template: ` 
    <div> 
     <ng-template [ngTemplateOutlet]="inputTemplate" #input></ng-template> 
    </div> 
    `, 
    directives: [] 
}) 

export class Child implements OnInit, OnAfterViewInit { 

    @ContentChild(TemplateRef) inputTemplate: TemplateRef<any>; 

    @ViewChildren(InputComponent) inputComponents : QueryList<InputComponent>; 

    constructor() { 

    } 

    ngAfterViewInit(){ 
    //THIS SHOULD NOT BE EMPTY 
    console.log(this.inputComponents.toArray()); 
    } 
} 

Bitte lassen Sie mich wissen, was ich falsch mache und wie/ob es möglich ist, eine Liste von InputComponents aus der Kinderkomponente zu erhalten.

Vielleicht sollte ich hier überhaupt keine Vorlage verwenden? Gibt es eine andere Möglichkeit, dieses Steuerelement anpassbar zu machen und weiterhin auf eine Liste verschachtelter InputComponents zugreifen zu können?

Im Fall, dass Sie mit ihm für mich here's the plunker

Antwort

4

Mit @ContentChildren(InputComponent) statt @ViewChildren() und Abonnieren von Änderungen

ngAfterViewInit(){ 
    //THIS SHOULD NOT BE EMPTY 
    this.inputComponents.changes.subscribe(c => console.log(this.inputComponents.toArray())); 
    //console.log(this.inputComponents.toArray()); 
    } 

gearbeitet spielen, aber ehrlich gesagt weiß ich nicht, mich, warum @ContentChildren() statt von @ViewChildren() funktioniert.

Plunker link

+1

'ViewChildren' funktioniert nicht, weil Komponenten im Inneren Inhalt DOM (nicht in der Ansicht DOM) –

+0

TemplateRef auch mit ContentChild gebunden ist und es funktioniert. Ich wusste nicht, dass ich Änderungen abonnieren kann. Soweit ich es gelesen habe, sollte es in ngAfterViewInit eingebunden sein, aber da diese Komponenten in einer Vorlage verschachtelt sind, nehme ich an, dass es später tatsächlich passiert ist. Danke für die Lösung! – kubal5003

+0

Ja, aber 'TemplateRef' ist tatsächlich übergebener Inhalt, aber die Vorlage wird dann in der Komponente gerendert und ich hatte erwartet, dass die erstellten Komponenten untergeordnet werden. Ja, das ist der Grund. Nur "TemplateRef" ist in "ngOnInit" oder "ngAfterViewInit" verfügbar, "ngTemplateOutlet" wird erst gerendert, nachdem dieser Änderungserkennungszyklus abgeschlossen ist. –

Verwandte Themen