2016-03-20 13 views
6

Nel componente Angular2 uso EventEmitter per emettere un evento con parametro. Nel listener del componente padre questo parametro non è definito. Ecco un plunker:Il parametro dell'emettitore di eventi non è definito per l'ascoltatore

import {Component, EventEmitter, Output} from 'angular2/core' 
@Component({ 
    template: `<ul> 
    <li *ngFor="#product of products" (click)="onClick(product)">{{product.name}}</li> 
    </ul>`, 
    selector: 'product-picker', 
    outputs: ['pick'] 
}) 
export class ProductPicker { 
    products: Array<any>; 
    pick: EventEmitter<any>; 
    constructor() { 
    this.products = [ 
     {id: 1, name: 'first product'}, 
     {id: 2, name: 'second product'}, 
     {id: 3, name: 'third product'}, 
     ]; 
    this.pick = new EventEmitter(); 
    } 
    onClick(product) { 
    this.pick.emit(product); 
    } 
} 
@Component({ 
    selector: 'my-app', 
    providers: [], 
    template: ` 
    <div> 
     <h2>Pick a product</h2> 
     <product-picker (pick)="onPick(item)"></product-picker> 
    </div> 
    <div>You picked: {{name}}</div> 
    `, 
    directives: [ProductPicker] 
}) 
export class App { 
    name: string = 'nothing'; 
    onPick(item) { 
    if (typeof item == 'undefined') { 
     console.log("item is undefined!"); 
    } else { 
     this.name = item.name; 
    } 
    } 
} 

Come passare il prodotto scelto per componente padre?

risposta

14

Si dovrebbe $ evento come questo:

<product-picker (pick)="onPick($event)"></product-picker> 

Esso corrisponde al valore fornito al momento dice il metodo Emit del EventEmitter associato.

Nel tuo caso la variabile oggetto fornita come parametro corrisponde a nulla.

+1

Funziona, grazie. Non è chiaro per me perché questo è corretto, quindi: '(click) =" onClick (prodotto) '. Qui il parametro è un nome di variabile, non $ event, ma il valore è visibile al listener (passare $ event sarebbe inutile Voglio dire, quando è necessario usare la parola "$ event" come parametro e quando un altro nome può essere usato? – camcam

+4

@camcam, quando ci colleghiamo a un evento personalizzato su un componente, '$ event' è lo speciale keyword che dobbiamo usare per ottenere il valore che era 'emit()' ted. Quando ci leghiamo a un evento DOM, come 'click',' $ event' è l'evento DOM. Per entrambi i tipi di binding, abbiamo anche accesso alle variabili di template locali, da qui il motivo per cui possiamo usare anche 'product'. –

+0

Grazie mille @Thierry Templier, ho avuto lo stesso problema, ma è stato risolto quando ho usato $ event nel template del componente padre