2016-03-20 16 views
6

Trong thành phần Angular2, tôi sử dụng EventEmitter để phát ra một sự kiện có tham số. Trong trình lắng nghe thành phần cha, tham số này là không xác định. Đây là một số plunker:Tham số của trình phát sự kiện không được xác định cho người nghe

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

Làm thế nào để chuyển sản phẩm đã chọn đến thành phần gốc?

Trả lời

14

Bạn nên $ sự kiện như thế này:

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

Nó tương ứng với giá trị mà bạn cung cấp khi nói phương pháp Emit của EventEmitter liên quan.

Trong trường hợp của bạn, biến mục được cung cấp làm tham số tương ứng với không có gì.

+1

Tác phẩm này, cảm ơn. Nó không rõ ràng cho tôi lý do tại sao điều này là chính xác, sau đó: '(click) =" onClick (sản phẩm) '. Ở đây tham số là một tên biến, không phải $ event, nhưng giá trị là hiển thị cho người nghe (đi $ event sẽ là vô ích Ý tôi là, khi cần sử dụng từ "$ event" làm tham số và khi một tên khác có thể được sử dụng? – camcam

+4

@camcam, khi chúng ta liên kết với một sự kiện tùy chỉnh trên một thành phần, '$ event' là đặc biệt từ khóa mà chúng ta phải sử dụng để lấy giá trị là 'emit()' ted Khi chúng ta liên kết với một sự kiện DOM, như 'click',' $ event' là sự kiện DOM. Đối với một trong hai kiểu ràng buộc, chúng ta cũng có quyền truy cập cho các biến mẫu cục bộ, do đó lý do chúng ta cũng có thể sử dụng 'product'. –

+0

Cảm ơn bạn rất nhiều @Thierry Templier, tôi đã gặp vấn đề tương tự, nhưng nó được giải quyết khi tôi sử dụng $ event trong template thành phần cha >

Các vấn đề liên quan