Bagaimana melewatkan 2 parameter ke EventEmitter angular2

92

Saya ada di komponen saya, EventEmittertetapi saya tidak dapat mengkompilasinya karena mengembalikan kesalahan: Supplied parameters do not match any signature of call target

Komponen saya:

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

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

Jika saya menghapus salah satu parameter di this.addModel.emit()dalamnya, tetapi demikian: Dapatkah saya meneruskan 2 parameter ke saya eventEmitterdan bagaimana?

Saya mencoba juga dengan:

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

tapi itu tidak berhasil.

LorenzoBerti
sumber

Jawaban:

181

Jika Anda melihat metode EventEmitterAPI emit, itu hanya dapat mengambil satu jenis parameterT

memancarkan (nilai ?: T)

Karena hanya satu parameter yang diperbolehkan, pertimbangkan untuk melewatkan parameter seperti dalam objectmetode emit. Demikian juga di bawah metode make& namevariabel memegang nilai masing-masing.

this.addModel.emit({make: make, name: name});
//shorthand is below
this.addModel.emit({make, name});
Pankaj Parkar
sumber
2
Oh, oke, terima kasih! itu akan this.addModel.emit ({make: make, name: name});
LorenzoBerti
4
@echonax tidak perlu melakukan itu, es6 akan mengurusnya periksa di sini
Pankaj Parkar
bagaimana saya bisa mengamati / mengambil nilai ini di komponen induk?
roshini
@roshini silakan lihat bagaimana interaksi komponen terjadi, pada dasarnya Anda perlu memancarkan data dari komponen anak ke komponen induk menggunakan EventEmitterobjek ..
Pankaj Parkar
terima kasih atas tanggapan Anda, saya tahu ini pemancar antar komponen tetapi perlu interaksi sebagai meneruskan data dari direktif ke komponen ..
roshini
41

Opsi lain untuk mengetik dengan kuat adalah sebagai berikut:

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

Anda kemudian dapat memancarkannya seperti acara @ Pankaj-Parkar

this.addModel.emit({make, name});
atau
this.addModel.emit({make: 'honda', name: 'civic'});

Anda sekarang memiliki pengetikan yang kuat daripada menggunakan objectatau any.

Andy Danger Gagne
sumber
22

Saya memperbaikinya dengan membuat

EventEmitter<object>();

Kemudian saya bisa melewati sebuah benda seperti:

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

Dan itu berhasil.

Adham Amiin
sumber
1
Ini bagus, Adham. Tidak ada yang bertentangan dengan jawaban Anda, tetapi perlu dicatat bahwa praktik standar - dan praktik yang baik - adalah selalu menyediakan Objek Acara bersama-sama dengan 1 atau lebih nilai : publish(event, value)& subscribe(e, value) {...}. Saya sedikit terkejut bahwa Angular mendefinisikan antarmuka mereka / menerapkan ini seperti yang mereka lakukan.
Cody
1
Tidak disukai mendukung solusi jenis kuat sepertinew EventEmitter<{name: string, age: number}>();
Liero
4

Saya tahu ini adalah Pertanyaan lama bagi saya. Saya akan membuat antarmuka dan mengirimkannya sebagai objek tempat saya dapat mengatur kode saya

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

dan menyebutnya sebagai berikut

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

    this.addModel.emit(savParamters);
khaled Dehia
sumber