Angular2检测服务中的变化

the*_*eva 27 angular

我在Angular2中有一个组件,它在我的服务translate.service.ts中更改了一个"lang"类变量.在另一个组件中,我正在使用init上的转换获取dict.如果第一个组件稍后更改了服务语言,我想自动重新获取第二个组件中的dict.我怎么做?

第一部分:

  setLang(lang) {
    this._translateService.setLang(lang);
  }
Run Code Online (Sandbox Code Playgroud)

服务:

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

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

getLang() {
    return this.dict;
}
Run Code Online (Sandbox Code Playgroud)

第二部分:

ngOnInit() {
    this.dict = this._translateService.getDict();
}
Run Code Online (Sandbox Code Playgroud)

Thi*_*ier 43

编辑:

Mark的评论之后,Subject/ Observable应该是首选的:

EventEmitter应仅用于在组件中发出自定义事件,并且我们应该将Rx用于其他可观察/事件方案.

原答案:

您应该EventEmitter在服务中使用:

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

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

  getLang() {
    return this.dict;
  }
}
Run Code Online (Sandbox Code Playgroud)

组件可以订阅此事件,以便在lang更新属性时收到通知.

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

  ngOnInit() {
    this._translateService.langUpdated.subscribe(
      (lang) => {
        this.dict = this._translateService.getDict();
      }
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅此问题:

  • 您能否更新答案以反映如何使用Subject/Observable? (3认同)
  • 这个答案肯定是正确的。但是被标记为不良做法(您不应在服务上使用事件模拟器)。/sf/ask/2336648751/#comment54684990_33382275 (2认同)
  • 那么最好的方法是什么?我想订阅我的提供程序 var,但我想在提供程序内部执行此操作,否则我需要更改很多组件 (2认同)