2016-06-09 88 views
4

我試圖讓2個組件通過使用middelman(Service)來相互交談。Angular 2 |對觀察點進行下標

我有一個像Photoshop一樣的應用程序,我想要一個組件(帶有按鈕的窗口)在我的'imageView'中添加一個圖層。

它們都嵌套在其他視圖中,所以我不能使用'@Output'。

按鈕觸發:

addLayer() { 
    this._broadcastService.addLayer(0); 
    } 

接收組件:

constructor(private _broadcastService:BroadcastService) { } 

    ngOnInit() { 
     this.subscription = this._broadcastService.layer$.subscribe(
     data => this.test(data)) 
    } 

廣播服務:

private _layerSubject = new BehaviorSubject<number>(0); 

    layer$ = this._layerSubject.asObservable(); 

    addLayer(data: number) { 
     this._layerSubject.next(data); 
    } 

接收模塊,沒有得到任何東西。他不會在啓動時觸發一次,我想每次按下添加圖層按鈕時都會觸發一些內容。

謝謝!

+0

什麼問題? –

+0

其不起作用 –

+0

什麼不起作用? –

回答

2

您需要提供BroadcastService一次一個共同的父組件像

@Component({ 
    selector: '...', 
    provide: [BroadcastService], 
    }) 
    class AppComponent {} 

要與整個應用程序共享同一個實例中的根組件,這是所有組件的共同母公司提供,並指令在您的Angular2應用程序中。 (或者您可以在bootstrap(AppComponent, [BroadcastService])處提供)

如果您在其他組件上提供它,此組件及其子將獲得不同的服務實例。

+0

此作品!太棒了,我不知道你的提供者何時下了'組件漏洞',非常感謝你! –

+1

Angular創建了類似於組件結構的注入器層次結構。當它需要一個依賴項時,它會開始查看提供者的當前組件/指令,如果它沒有找到它,它將繼續在父注入器上,直到它找到一個爲止。 –

+0

每當我啓動應用程序,訂閱被解僱,這是爲什麼?我如何防止它發生? –