2017-10-20 2 views
0

Ich habe ein bisschen ein Problem mit der folgenden Situation in Angular.Javascript Angular 4 mit eventEmitter obwohl mehrere Schichten von Komponenten

Ich benutze Angular 4 und das ist die Situation.

app.component.html enthält ein Wrapper div, das ich in der Lage sein möchte, seine Farbe durch Hinzufügen einer Klasse zu ändern.

Mein Problem ist, dass ich verschiedene Schichten von Komponenten habe.

Zum Beispiel, wenn ich die Klasse in app.component.html ändern wollte wäre es diese:

app.component - root 

button-wrapper.component - holds the button 

button.component - message comes from there. 

Normalerweise dies könnte ich tun:

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

@Component({ 
    selector: 'app-root', 
    templateUrl: './app.component.html', 
    styleUrls: ['./app.component.scss'] 
}) 
export class AppComponent { 
    title = 'app'; 
    myClass = ''; 

    handleEvent(value) { 
    console.log(value); 
    myClass = value; 
    } 
} 

und in app.component .html diese:

<div [ngClass]="myClass"> 

    <app-button (outputEvent)="handleEvent($event)"></app-button> 

</div> 

ABER, ist mein Problem, dass App-Button-Komponente ist innerhalb Knopf Wrapper-Komponente so i t sieht wie folgt aus:

<div [ngClass]="myClass"> 

    <button-wrapper></div> 

</div> 

Wo würde ich habe dies:

(outputEvent)="handleEvent($event)" 

Wie kann ich um dieses Problem zu gehen?

+0

'Knopf wrapper' ist in 'AppComponent'? –

+1

Um die Eltern-Kind-Kommunikation zwischen mehreren Ebenen zu verwenden, muss jede Ebene in die übergeordneten oder untergeordneten Ebenen ein- und ausgegeben werden. Oder Sie können einen "Shared Service" verwenden, um zwischen Layern zu kommunizieren, die nicht Eltern/Kind sind, wie hier erklärt: https://angular.io/guide/component-interaction#parent-and-children-communicate-via-a-service –

Antwort

2

Sie können Kette Ereignisse, solange ihre direkte Kinder:

button.component.ts (Selektor: app-Taste)

startChainEvent() { 
    this.outputEvent.emit('className'); 
} 

Knopf wrapper.component.html

<app-button (outputEvent)="handleEvent($event)"></app-button> 

button-wrapper.component.ts (selector: app-button-Wrapper)

handleEvent(e) { 
    this.outputEvent.emit(e); 
} 

app.component.html

<app-button-wrapper (outputEvent)="handleEvent($event)"></app-button-wrapper> 

app.component.ts

handleEvent(e) { 
    myClass = e; 
} 
Verwandte Themen