无法调用其类型缺少调用签名的表达式。类型 'EventEmitter<Number>' 没有兼容的调用签名

Cannot invoke an expression whose type lacks a call signature. Type 'EventEmitter<Number>' has no compatible call signatures

我正在尝试编写一个服务,其中一些事件通过其中的相应方法触发,以便我的应用程序中的任何组件都可以侦听它。

因此,我在服务中创建了一个自定义事件,如下所示

export class EventsService {

@Output() expandNav: EventEmitter<Number> = new EventEmitter();

trigExpandNav() {
this.expandNav.emit(1);
}

constructor() { }
}

然后我将此服务作为提供者包含在我的组件中,我想在其中通过 trigExpandNav 方法发出此事件,如下所示:

import {
Component,
OnInit,
Output,
EventEmitter
} from '@angular/core';
import {
EventsService
} from '../../services/events.service';

@Component({
selector: 'app-header',
templateUrl: './header.component.html',
styleUrls: ['./header.component.css'],
providers: [EventsService]
})
export class HeaderComponent implements OnInit {

eventsService: EventsService;

fun() {
this.eventsService.trigExpandNav();
}

 constructor() {}

 ngOnInit() {}

 }

但是我收到这个错误

 ERROR in src/app/layout/header/header.component.ts(21,7): error TS2349: Cannot invoke an expression whose type lacks a call signature. Type 'EventEmitter<Number>' has no compatible call signatures.

我不知道我哪里做错了,所以请帮助并提前致谢。

重要

我想要实现的是:

假设我有 2 个组件。我想在单击按钮或 link 时触发第一个组件的事件,并在 html 文件的第二个组件中收听该事件,例如 sda

为此,我制作了一项服务,在该服务中我通过一种方法发出事件。问题是它按预期工作。

你不应该为服务使用事件发射器,这是一个更适合 RxJS BehaviorSubject 或 Subject 的地方。根据您的需要。

@Ouput()s 和 EventEmitters 仅适用于组件

所以你的服务应该是这样的:

export class EventsService {

   private expandNavSubject = new BehaviorSubject<number>(null);

   trigExpandNav() {
      this.expandNavSubject.next(1);
   }

   get expandNav$(){
     this.expandNavSubject.asObservable();
   }

   constructor() { }
   }
}

然后在您的 header 组件中通过构造函数注入服务:

constructor(private eventsService: EventsService){}

并在 fun() 函数中使用 this.eventsService.trigExpandNav(); 调用触发器展开导航函数