2017-07-04 121 views
5

什麼我想要實現我想在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 
    } 

如何實現以上?

回答

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") 
     } 
} 
+0

你不應該在你的服務中使用'EventEmitter'; https://stackoverflow.com/questions/36076700/what-is-the-proper-use-of-an-eventemitter。改用'Observable' /'Subject'。 – echonax

+0

真棒米拉感謝 –

1

Angular中沒有任何模式可以實現您所要求的功能。

我能爲您想到的最佳選擇是創建自定義服務。創建一些你注入AppComponent的服務(因此只有一個服務實例)。在服務中,您可以擁有任何您想要的邏輯。

+0

對於角2中的全球事件,您可能想看看這個:https://modewagon.wordpress.com/2017/09/12/angular2-4-global-events/可能會幫助 –