2017-03-24 2 views
0

das folgende Snippet Parent ‚s-Vorlage vor:Angularjs 2: Access-Komponente einer Richtlinie

<div *ngFor= "let event of events" > 
    <event-thumbnail [theEvent] = 'event'></event-thumbnail>      
</div> 

Auch event-thumbnail Komponente Definition lautet:

export class EventThumbnailComponent{ 
    intoroduceYourself(){ 
     console.log('I am X'); 
    } 
} 

In Parent Komponentenklasse, ich will Um über alle generierten event-thumbnail Elemente zu iterieren, greifen Sie auf die Komponente unter jedem Element zu und rufen Sie die Funktion introduceYourself auf einem einzelnen davon auf.

+1

Mögliche Duplikat [Child für Eltern Ereignis hört in Angular 2] (http://stackoverflow.com/questions/37677122/child-listens-for-parent -event-in-angular-2)? d. h. erlauben Sie Ihrer 'EventThumbnailComponent', das Eltern-Ereignis anzuhören, so dass Sie die dom-Elemente nicht manuell durchlaufen müssen. – Zze

+0

Sehen Sie sich insbesondere [diese Antwort] (http://stackoverflow.com/a/40143881/6680611) im Duplikatziel an. – cartant

Antwort

3

Sie wollen die @ViewChildren() Dekorateur verwenden, um eine Liste aller Instanzen eines bestimmten Komponententyp in der Ansicht zu erhalten:

class ParentComponent implements AfterViewInit { 
    @ViewChildren(EventThumbnailComponent) 
    eventThumbnails: QueryList<EventThumbnailComponent>; 

    ngAfterViewInit(): void { 
     // Loop over your components and call the method on each one 
     this.eventThumbnails.forEach(component => component.introduceYourself()); 

     // You can also subscribe to changes... 
     this.eventThumbnails.changes.subscribe(r => {    
      // Do something when the QueryList changes 
     }); 
    } 
} 

Die eventThumbnails Eigenschaft wird aktualisiert werden, wenn eine Instanz dieser Komponente zur Ansicht hinzugefügt oder aus ihr entfernt wird. Beachten Sie, dass die eventThumbnails nicht auf ngAfterViewInit festgelegt ist.

Siehe hier Dokumentation für weitere Informationen: https://angular.io/docs/ts/latest/api/core/index/ViewChildren-decorator.html

+0

Arbeitete wie ein Charme! – Hans

+0

Perfekte Antwort. Also nichts gegen dich, @DriFTy, aber ist es nicht traurig, dass wir uns auf eine Ebene der Manipulationsabstraktion zurückentwickelt haben, die weit unter der von jQuery liegt. –

0

Ihre untergeordnete Komponente sollte @Input() theEvent haben, um Zugriff auf das Ereignis zu erhalten, das Sie übergeben. Dann können Sie den folgenden Lifecycle-Haken verwenden:

ngOnInit(){ 
    introduceYourself(){ 
     console.log('I am X'); 
    } 
}