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.