2016-03-08 45 views
15

我在Angular2中有一個組件,它正在改變服務translate.service.ts中的「lang」類變量。在另一個組件中,我使用init中的翻譯來獲取字典。如果第一個組件稍後更改了服務語言,我想要自動在第二個組件中重新獲取該詞典。我怎麼做?Angular2檢測服務中的變化

第一部分:

setLang(lang) { 
    this._translateService.setLang(lang); 
    } 

服務:

dict = { "en": {}}; 
lang = "en"; 

setLang(lang) { 
    this.lang = lang; 
} 

getLang() { 
    return this.dict; 
} 

第二部分:

ngOnInit() { 
    this.dict = this._translateService.getDict(); 
} 
+0

在服務中,你是修改'dict'還是替換它?如果只修改它,第二個組件會自動獲取/查看更改,因爲它具有對'dict'對象的引用(不是副本)。 –

回答

27

你應該在服務中使用的EventEmitter

export class LangService { 
    langUpdated:EventEmitter = new EventEmitter(); 

    setLang(lang) { 
    this.lang = lang; 
    this.langUpdated.emit(this.lang); 
    } 

    getLang() { 
    return this.dict; 
    } 
} 

組件可以訂閱此事件以在lang屬性更新時得到通知。

export class MyComponent { 
    constructor(private _translateService:LangService) { 
    } 

    ngOnInit() { 
    this._translateService.langUpdated.subscribe(
     (lang) => { 
     this.dict = this._translateService.getDict(); 
     } 
    ); 
    } 
} 

詳情請參見這個問題:

編輯

Mark的評論,一個Subject/Observable應首選:

EventEmitter應該僅被用於發光元件的自定義活動,並且我們應該使用的Rx爲其他可觀察/事件場景。

+1

就這樣說,你可以使用Subject.next(),它幾乎是[EventEmitter.emit](https://github.com/angular/angular/blob/master/modules/%40angular/facade/src/async .ts#L78)。 –

+1

根據我的理解,EventEmitter只能與@output一起使用? – Mackelito

+0

你能否更新答案以反映如何使用Subject/Observable? – harishr