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.