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.

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

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.


22

Saya memperbaikinya dengan membuat

EventEmitter<object>();

Kemudian saya bisa melewati sebuah benda seperti:

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

Dan itu berhasil.


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);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.