在全球范围内发布事件

时间:2017-07-04 10:37:15

标签: javascript angular typescript

我想要实现的是我想在angular2中全局发出一个自定义事件并让多个组件监听它,而不仅仅是父子模式

在我的事件源组件中,我有

export class EventSourceComponent{

  @Output() testev = new EventEmitter();

  onbtnclick(){
    this.testev.emit("i have emitted an event")
  }
 }

现在我想要其他组件来获取此事件

export class CmpTwoComponent{

    //here get the emitted event with data
  } 

我如何实现上述目标?

2 个答案:

答案 0 :(得分:3)

您可以使用共享服务。

export class EventSourceComponent{
    constructor(private sharedService : SharedService){}


      onbtnclick(){
        this.sharedService.testev.next("i have emitted an event")
      }
 }

export class CmpTwoComponent{

//here get the emitted event with data

   constructor(sharedService : SharedService){

      sharedService.testev.subscribe((event)=>{console.log(event)})
   }

} 

然后sharedService将是

@Injectable()
export class SharedService{

   public testev = new Subject()

}

显然,如果您仍然需要Output,那么父组件可以正常订阅,您也可以添加它:

export class EventSourceComponent{

    @Output() testev = new EventEmitter();
    constructor(private sharedService : SharedService){}


      onbtnclick(){
        this.testev.emit("i have emitted an event")
        this.sharedService.testev.next("i have emitted an event")
      }
 }

答案 1 :(得分:1)

Angular中没有任何模式可以实现您的要求。

我能为您考虑的最佳选择是创建自定义服务。制作一些注入AppComponent的服务(因此只有一个服务实例)。在服务中,您可以拥有您想要的任何逻辑。