2016-03-08 44 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