2016-07-06 19 views
6

Was ist change Ereignis in Angular 2? Wann wird es versendet und wie kann ich es verwenden?
I. e. Was habe ich im folgenden Code über (change)="update()" abonniert?Was ist `Change` Ereignis in Angular 2

http://plnkr.co/edit/mfoToOSLU6IU2zr0A8OB?p=preview

import {Component, View, Input, Output, EventEmitter, OnChanges} from '@angular/core' 

@Component({ 
    selector: 'inner-component', 
    template: ` 
    <label><input type="checkbox" [(ngModel)]="data.isSelected"> Selected</label> 
    ` 
}) 
export class InnerComponent { 
    data = { isSelected: false }; 
} 

@Component({ 
    selector: 'my-app', 
    template: ` 
    <p><inner-component (change)="update()"></inner-component></p> 
    <p>The component was updated {{count}} times</p> 
    `, 
    directives: [InnerComponent] 
}) 
export class AppComponent { 
    count = 0; 

    update() { 
    ++this.count; 
    } 
} 

PS: Same question in Russian.

+0

Ich bin so überrascht es funktioniert. Fühlt sich wie ein Käfer aus eckigen an. – maxisam

Antwort

12

Das Ereignis sprudelnden ist: tritt auf input, dann Blasen von Dom Baum und wird auf inner-component Element behandelt. Es kann durch Protokollierung und Ereignis überprüft werden:

http://plnkr.co/edit/J8pRg3ow41PAqdMteKwg?p=preview

@Component({ 
    selector: 'my-app', 
    template: ` 
    <p><inner-component (change)="update($event)"></inner-component></p> 
    <p>The component was updated {{count}} times</p> 
    `, 
    directives: [InnerComponent] 
}) 
export class AppComponent { 
    count = 0; 

    update($event) { 
    console.log($event, $event.target, $event.currentTarget); 
    ++this.count; 
    } 
} 
+2

Also können wir eigentlich überall hin (ändern). Das überrascht mich wirklich. – maxisam

3

Das Ereignis change informiert Sie über eine Änderung in einem Eingabefeld. Da Ihre innere Komponente keine native Angular Komponente ist, müssen Sie die Ereignis-Emitter selbst specifiy:

@Component({ 
    selector: 'inner-component', 
    template: ` 
    <label><input type="checkbox" (change)="inputChange.emit($event)" [(ngModel)]="data.isSelected"> Selected</label> 
    ` 
}) 
export class InnerComponent { 
    @Output('change') inputChange = new EventEmitter(); 

    data = { isSelected: false }; 
} 

Und in Ihrem AppComponent sind empfangen Sie jetzt die Ereignisse:

@Component({ 
    selector: 'my-app', 
    template: ` 
    <p><inner-component (change)="update($event)"></inner-component></p> 
    <p>The component was updated {{count}} times</p> 
    `, 
    directives: [InnerComponent] 
}) 
export class AppComponent { 
    count = 0; 

    update(event: any) { 
    ++this.count; 
    console.log(event); 
    } 
} 
+1

[Mein Code] (// plnrkr.co/edit/mfoToOSLU6IU2zr0A8OB?p=preview) ** funktioniert **. Wenn Sie Plunker öffnen, sehen Sie nach dem Aktivieren des Kontrollkästchens eine steigende Anzahl von Änderungen. In [Sie code] (// plnkr.co/edit/wCR7xS7ygEZijsN4B34W?p=preview) wird "change" bei jedem Checkbox-Klick ** zweimal ** genannt. – Qwertiy

+0

Ich fand den Grund. Danke für den Arbeitscode mit '(change)' am Eingang - in meiner ursprünglichen Version hat es nicht funktioniert, weil ich EventEmitter als 'change' benannt habe. – Qwertiy