EventEmitter angular2'ye 2 parametre nasıl aktarılır?


92

Bileşenimde bir var EventEmitterama onu derleyemiyorum çünkü hatayı döndürüyor: Supplied parameters do not match any signature of call target

Bileşenim:

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

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

İçindeki parametrelerden birini silersem this.addModel.emit()çalışır, ancak şu şekilde: 2 parametreyi kendime eventEmitterve nasıl geçirebilirim ?

Ben de denedim:

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

ama işe yaramıyor.

Yanıtlar:


181

EventEmitterAPI'nin emityöntemine bakarsanız, yalnızca tek bir tür parametresi alabilirT

emit (değer ?: T)

Yalnızca tek bir parametreye izin verildiğinden, objectemit yönteminde olduğu gibi parametre geçirmeyi düşünün . Aynı şekilde aşağıdaki yöntem makeve namedeğişken de ilgili değerleri tutmaktadır.

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

2
Oh, tamam teşekkür ederim! this.addModel.emit ({make: make, name: name});
— LorenzoBerti

4
@echonax buna gerek yok, es6 bununla ilgilenecek burayı kontrol edin
— Pankaj Parkar

üst bileşende bu değeri nasıl gözlemleyebilirim / alabilirim?
— roshini

@roshini lütfen bileşen etkileşiminin nasıl gerçekleştiğine bir göz atın , temelde EventEmitternesneyi kullanarak alt bileşenden üst bileşene veri göndermeniz gerekir ..
— Pankaj Parkar

Yanıtınız için teşekkürler, bu yayıcıyı bileşenler arasında biliyorum, ancak verileri yönergeden bileşene
— aktarırken

41

Kesin bir şekilde yazmak için başka bir seçenek aşağıdaki gibidir:

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

daha sonra @ Pankaj-Parkar şovları gibi yayınlayabilirsiniz

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

Artık objectveya kullanmak yerine güçlü bir yazımınız var any.


22

Yaparak düzelttim

EventEmitter<object>();

Sonra aşağıdaki gibi bir nesneyi geçmeyi başardım:

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

Ve işe yaradı.


1
Bu harika, Adham. Cevabınıza aykırı bir şey yok, ancak standart bir uygulamanın - ve iyi bir uygulamanın - her zaman 1 veya daha fazla değerle birlikte bir Etkinlik Nesnesi sağlamak olduğunu belirtmek gerekir : publish(event, value)& subscribe(e, value) {...}. Angular'ın arayüzlerini bu şekilde tanımlamasına / uygulamasına biraz şaşırdım.
— Cody

1
Gibi güçlü tür çözümler lehine olumsuz oy verildinew EventEmitter<{name: string, age: number}>();
— Liero

4

Bunun benim için eski bir Soru olduğunu biliyorum Bir arayüz oluşturup kodumu daha düzenli hale getirebileceğim bir nesne olarak gönderirdim

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

ve aşağıdaki gibi çağırın

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

    this.addModel.emit(savParamters);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.