Як передавати 2 параметри EventEmitter angular2


92

У мене є компонент an, EventEmitterале я не можу його скомпілювати, оскільки він повертає помилку: Supplied parameters do not match any signature of call target

Мій компонент:

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

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

Якщо я видалю один із параметрів, this.addModel.emit()він працює, але так: чи можу я передати 2 параметри своїм eventEmitterі як?

Я також намагався:

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

але це не працює.

Відповіді:


181

Якщо поглянути на метод EventEmitterAPI emit, він може приймати лише один параметр типуT

випромінювати (значення ?: T)

Оскільки дозволений лише один параметр, розгляньте можливість передачі параметра як у objectметоді emit. Подібним чином, нижче метод makeі nameзмінна містять відповідні значення.

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

2
О, добре, дякую! це буде this.addModel.emit ({make: make, name: name});
LorenzoBerti

4
@echonax не потрібно цього робити, es6 подбає про це, перевірте тут
Pankaj Parkar

як я можу спостерігати / приймати це значення в батьківському компоненті?
roshini

@roshini, будь ласка, подивіться, як відбувається взаємодія компонентів , в основному вам потрібно емітувати дані з дочірнього компонента в батьківський компонент за допомогою EventEmitterоб'єкта ..
Панкадж Паркар,

дякую за вашу відповідь, я знаю цей випромінювач між компонентами, але потребую взаємодії як передачі даних від директиви до компонента ..
roshini

41

Інший варіант його сильного набору полягає в наступному:

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

потім ви можете випускати це, як шоу @ Pankaj-Parkar

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

Тепер у вас сильний набір тексту замість того, щоб використовувати objectабо any.


22

Я це виправив, зробивши

EventEmitter<object>();

Потім я зміг передати такий об’єкт, як:

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

І це спрацювало.


1
Це чудово, Адеме. Нічого проти вашої відповіді, але варто зазначити, що стандартна практика - і хороша практика - це завжди поставляти Об’єкт Події в тандемі з 1 або більше значеннями : publish(event, value)& subscribe(e, value) {...}. Я трохи здивований, що Angular визначив свій інтерфейс / реалізував це так, як вони це зробили.
Коді

1
Проголосував за користь таких типів рішень, якnew EventEmitter<{name: string, age: number}>();
Liero

4

Я знаю, що це старе запитання для мене. Я б створив інтерфейс і надіслав його як об’єкт, де я можу мати більш організований код

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

і назвіть це наступним чином

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

    this.addModel.emit(savParamters);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.