2016-07-24 9 views
1

Ich versuche herauszufinden, wie eine lokale Referenz in einer übergeordneten Komponente Vorlage, d. H. #rightNav von einer untergeordneten Komponente Vorlage klicken Sie auf Ereignis (click)="rightNav.open()" mit Material 2 sidenav. Ich denke, ich muss die @ViewChild Annotation verwenden, aber nicht sicher, wie.Wie löst man den lokalen Bezug in der Elternkomponente aus dem Kindkomponentenereignis in Angular 2 aus?

Child Komponentenvorlage (app-Bedingungen-Liste):

<div *ngFor="let condition of conditions" [class.selected]="condition === selectedCondition" 
      (click)="rightNav.open()"></div> 

Geordnete Komponente Vorlage (Bedingung Komponente):

import { Component} from '@angular/core'; 
import { ConditionsListComponent } from './listComponent/conditions-list.component'; 


@Component({ 
    moduleId: module.id, 
    selector: 'app-conditions', 
    template: ` 
      <md-sidenav #rightNav align="end" mode="side"> 
      "Condition details will open here on click event" 
      </md-sidenav> 
      <app-conditions-list></app-conditions-list>`, 
    styleUrls: ['./conditions.component.css'], 
    directives: [ 
     ConditionsListComponent, 
    ] 
}) 

export class ConditionsComponent { 
    title = "Conditions Manager" 
} 

Das Kind Komponente in der übergeordneten Komponente verschachtelt Vorlage. Danke!

+0

Für mich ist es nicht klar, wie '' und '' sind verwandt. Was meinst du mit "Elternkomponente"? –

+0

Danke @ GünterZöchbauer. Ich habe den Code aufgeräumt, um irrelevanten Code zu entfernen. Die Elternkomponente ist der Ort, an dem die Referenz #RightNav ist. – odenman250

+0

Bitte fügen Sie weiteren Code hinzu. Für mich ist immer noch völlig unklar, was Sie zu erreichen versuchen. –

Antwort

1

Sie können eine Ausgabe an die untergeordnete Komponente hinzufügen, und hören von ihm, an Veranstaltungen

export class ConditionsListComponent { 
    @Output() navOpen:EventEmitter = new EventEmitter(); 
} 

können Sie eine Template-Variable verwenden, um auf gleiche Elemente beziehen Geschwister wie:

<div #rightNav align="end" mode="side" (close)="close($event)"</div> 
<app-conditions-list (navOpen)="rightNav.open()"></app-conditions-list>`, 

und Ereignis ein Ereignis wie

<div *ngFor="let condition of conditions" [class.selected]="condition === selectedCondition" 
     (click)="navOpen.next(null)"></div> 
1

Sie müssten Ihre Veranstaltung von Ihrem Kind zu Ihren Eltern blasen:

The child : 

export class ConditionsListComponent { 
    @Output('myEvent') myEvent = new EventEmitter(); 

    private bubbleUp($event:Event){ 

    myEvent.emit($event) 
    } 
} 

Es ist der Ansicht:

<div *ngFor="let condition of conditions" [class.selected]="condition === selectedCondition" 
     (click)="bubbleUp($event)"></div> 

Und die Eltern:

 import { Component} from '@angular/core'; 

@Component({ 
moduleId: module.id, 
selector: 'app-conditions', 
template: ` 
     <div #rightNav align="end" mode="side" (close)="close($event)"</div> 
     <app-conditions-list (myEvent)='gotTheEvent($event)' ></app-conditions-list>`, 
styleUrls: ['./conditions.component.css'], 
providers: [], 
directives: [ 
    ConditionsListComponent, 
] 
}) 

export class ConditionsComponent { 
    title = "Conditions Manager"; 

    gotTheEvent($event){ 

    console.log('I got this event from my child',$event); 

    //you can do whatever you want : 

    rightNav.open() 
    } 
} 
Verwandte Themen