Cách chuyển 2 tham số cho EventEmitter angle2


92

Tôi có trong thành phần của mình một an EventEmitternhưng tôi không thể biên dịch nó vì nó trả về lỗi: Supplied parameters do not match any signature of call target

Thành phần của tôi:

@Output() addModel = new EventEmitter<any>();

saveModel($event, make, name) {
    this.addModel.emit(make, name);
}

Nếu tôi xóa một trong các tham số trong this.addModel.emit()nó hoạt động, nhưng như vậy: Tôi có thể chuyển 2 tham số cho của tôi không eventEmittervà bằng cách nào?

Tôi cũng đã thử với:

@Output() addModel = new EventEmitter<any,any>();

nhưng Nó không hoạt động.

Câu trả lời:


182

Nếu bạn nhìn vào phương thức EventEmittercủa API emit, nó chỉ có thể nhận một tham số duy nhất của loạiT

phát ra (giá trị?: T)

Vì chỉ cho phép một tham số duy nhất, hãy xem xét việc truyền tham số như trong objectphương thức phát. Tương tự như vậy trong phương thức make& namebiến dưới đây đang giữ các giá trị tương ứng của chúng.

this.addModel.emit({make: make, name: name});
//shorthand is below
this.addModel.emit({make, name});

2
Ồ OK cám ơn bạn! it will this.addModel.emit ({make: make, name: name});
LorenzoBerti

4
@echonax không cần phải làm điều đó, es6 sẽ chăm sóc nó kiểm tra ở đây
Pankaj Parkar

làm thế nào tôi có thể quan sát / lấy giá trị này trong thành phần mẹ?
roshini

@roshini xin hãy nhìn vào cách tương tác thành phần xảy ra, về cơ bản bạn cần phải phát ra dữ liệu từ thành phần con để phần cha mẹ sử dụng EventEmitterđối tượng ..
Pankaj Parkar

cảm ơn phản hồi của bạn, tôi biết bộ phát này giữa các thành phần nhưng cần sự tương tác khi chuyển dữ liệu từ chỉ thị sang thành phần ..
roshini

42

Một tùy chọn khác để gõ mạnh nó như sau:

@Output addModel = new EventEmitter<{make: string, name: string}>();

sau đó bạn có thể phát ra nó giống như các chương trình @ Pankaj-Parkar

this.addModel.emit({make, name});
hoặc là
this.addModel.emit({make: 'honda', name: 'civic'});

Bây giờ bạn có cách gõ mạnh thay vì sử dụng objecthoặc any.


22

Tôi đã sửa nó bằng cách làm

EventEmitter<object>();

Sau đó, tôi đã có thể chuyển một đối tượng như:

this.MyOutputVariable.emit({ name: 'jack', age: '12' });

Va no đa hoạt động.


1
Điều này thật tuyệt, Adham. Không có gì chống lại câu trả lời của bạn, nhưng cần lưu ý rằng một phương pháp tiêu chuẩn - và một phương pháp tốt - là luôn cung cấp một Đối tượng Sự kiện song song với 1 hoặc nhiều giá trị : publish(event, value)& subscribe(e, value) {...}. Tôi hơi ngạc nhiên khi Angular xác định giao diện của họ / triển khai điều này theo cách họ đã làm.
Cody

2
Downvoted ủng hộ mạnh mẽ các loại giải pháp thíchnew EventEmitter<{name: string, age: number}>();
Liero

4

Tôi biết đây là một Câu hỏi cũ dành cho tôi Tôi sẽ tạo một giao diện và gửi nó dưới dạng một đối tượng để tôi có thể sắp xếp mã của mình một cách ngăn nắp hơn

 export interface addModelArgs{
      make:string,
      name:string
    }
@Output() addModel = new EventEmitter<addModelArgs>();

và gọi nó như sau

    this.addModel.emit({make: 'honda', name: 'civic'});
or 
    let savParamters:addModelArgs={make: 'honda', name: 'civic'};

    this.addModel.emit(savParamters);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.