2016-03-30 20 views
2

因此,我知道您可以讓兩個不相關的組件通過服務相互通信,方法是讓一個組件在服務中發出事件,另一個組件在服務中訂閱它。組件中的角度服務調用功能

我的問題:

服務可以直接調用組件中的函數嗎?

+0

裏面如果你在你的服務的組件,確保一個參考。但我不會推薦兩個相互指稱的類。 –

+1

所以基本上事件拋出和訂閱方法是最佳實踐? –

+0

Definetely。你可以用觀察者來做到這一點。你想保持它分離,以保持分離的擔憂。 Günter的答案似乎是正確的。 –

回答

9

不是默認情況下。服務是一個類的實例,僅此而已。

@Injectable() 
class MyService { 
} 

@Component({ 
    selector: 'my-component', 
    ... 
)} 
class MyComponent { 
    constructor(private myService:MyService) {} 
} 

@NgModule({ 
    providers: [MyService], 
    ... 
}) 
export class AppModule {} 

這樣一個服務(MyService)實例被傳遞給MyComponent但僅此而已。服務實例不知道MyComponent

您可能想要的是將Observable添加到您的服務中並在您的組件中訂閱它。

@Component({ 
    selector: 'my-component', 
    ... 
)} 
class MyComponent { 
    constructor(myService:MyService) { 
    myService.someObservable.subscribe(value => doSomething(value)); 
    } 

    doSomething(value) { 
    console.debug(value); 
    } 
} 

這種方式,服務「呼叫」的部件上的方法中,當ObservablesomeObservable發出另一個值。

欲瞭解更多詳情,請參閱detect change of nested property for component input

+0

您必須確保組件中注入的MyService和其他位置中的MyService引用同一對象。否則,該組件將無法響應MyService的事件。 – Chao

+0

這是通過提供它不直接在組件,但在一個共同的父母(或AppComponent'這是整個應用程序的共同父母,或在'bootstrap()') –

+0

你是對的。我只是注意到其他人。你會得到一個好的解決方案 – Chao

0

上面的答案是,只是你不引導你的服務是正確的,你會在你的app.module陣列供應商添加爲您服務。

@NgModule({ 
    declarations: [MyComponent], 
    imports: [], 
    providers: [MyService], 
    bootstrap: [AppComponent] 
}) 

然後你注入你的服務組件

import { Component } from '@angular/core' 

import { MyService } from './path/to/my.service' 

... 

export class MyComponent { 

    constructor(private myService:MyService){} 

}