2016-07-06 29 views
6

Che cos'è l'evento change in Angular 2? Quando viene inviato e come posso usarlo?
I. e. cosa ho sottoscritto nel seguente codice tramite (change)="update()"?Che cos'è l'evento `change` 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

Sono così sorpreso che funziona. Si sente come un insetto da angolare. – maxisam

risposta

12

Questo è spumeggiante evento: change si verifica su input, quindi bolle da albero di dom e viene gestito sull'elemento inner-component. Può essere controllato dal disboscamento ed evento:

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

Quindi in realtà possiamo usare (cambiare) ovunque. Questo mi sorprende davvero. – maxisam

3

L'evento change notifica l'avvenuta modifica in un campo di input. Dal momento che il componente interna non è un componente angolare nativa, è necessario specifiy l'evento emettitore da soli:

@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 }; 
} 

E nel tuo AppComponent si sta ora ricevendo gli eventi:

@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

[Il mio codice] (// plnkr.co/edit/mfoToOSLU6IU2zr0A8OB?p=preview) ** è ** funzionante. Se apri il plunker, vedrai un numero crescente di modifiche dopo aver fatto clic sulla casella di controllo. In [codice dell'utente] (// plnkr.co/edit/wCR7xS7ygEZijsN4B34W?p=preview) 'change' è chiamato ** due volte ** su ogni casella di controllo. – Qwertiy

+0

Ho trovato il motivo. Grazie per aver lavorato codice con '(change)' su input - nella mia versione iniziale non ha funzionato perché ho chiamato EventEmitter come 'change'. – Qwertiy