I have in my component an EventEmitter
but I can't compile it because it throws the error:
Supplied parameters do not match any signature of call target
My component:
@Output() addModel = new EventEmitter<any>();
saveModel($event, make, name) {
this.addModel.emit(make, name);
}
If I delete one of the parameters in this.addModel.emit()
it works but is it possible to pass 2 parameters to EventEmitter
and how?
For passing the parameters, we will wrap all the parameters inside the curly brackets (this will combine them as a single object) and pass it to the emit method. To receive the parameters in the parent component, we will make a similar type of object and update its value with that of the received object.
@Input() and @Output() allow Angular to share data between the parent context and child directives or components. An @Input() property is writable while an @Output() property is observable.
🎊 Event Emitters in Angular 🎊 Data flows into your component via property bindings and flows out of your component through event bindings. If you want your component to notify his parent about something you can use the Output decorator with EventEmitter to create a custom event.
EventEmitter is used in the directives and components to emit custom events either synchronously or asynchronously. Since EventEmitter class extends RxJS subject class, this means it is observable and can be multicasted to many observers. In Angular 1 Http was a promise based service.
If you look at the EventEmitter emit method @ angular.io, it can only take a single parameter of type T
emit(value?: T)
Since only a single parameter is allowed, consider passing it as an object
in emit
method.
In the snippet below, make
& name
variables are holding their respective values:
this.addModel.emit({make: make, name: name});
//shorthand is below
this.addModel.emit({make, name});
Another option to strongly type it is as follows:
@Output addModel = new EventEmitter<{make: string, name: string}>();
you can then emit it like @Pankaj-Parkar shows
this.addModel.emit({make, name});
orthis.addModel.emit({make: 'honda', name: 'civic'});
You now have strong typing instead of using object
or any
.
I fixed it by making
EventEmitter<object>();
Then I was able to pass an object such as:
this.MyOutputVariable.emit({ name: 'jack', age: '12' });
And it worked.
I know this is an old Question for me I would create an interface and send it as an object where I can have my code more organized
export interface addModelArgs{
make:string,
name:string
}
@Output() addModel = new EventEmitter<addModelArgs>();
and call it as following
this.addModel.emit({make: 'honda', name: 'civic'});
or
let savParamters:addModelArgs={make: 'honda', name: 'civic'};
this.addModel.emit(savParamters);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With