【问题标题】:Angular2 detect change in serviceAngular2检测服务变化
【发布时间】:2016-03-08 14:00:20
【问题描述】:

我在 Angular2 中有一个组件正在更改我的服务 translate.service.ts 中的“lang”类变量。在另一个组件中,我正在获取一个带有 init 翻译的字典。如果第一个组件稍后更改服务语言,我想自动重新获取第二个组件中的字典。我该怎么做?

第一个组件:

  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();
}

【问题讨论】:

  • 服务中是修改dict还是替换?如果您只修改它,第二个组件将自动获取/查看更改,因为它引用了dict 对象(不是副本)。

标签: angular


【解决方案1】:

编辑:

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;
  }
}

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

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

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

查看这个问题了解更多详情:

【讨论】:

  • 话虽如此,您可以使用 Subject.next() 这几乎就是 EventEmitter.emit 所做的。
  • 据我了解,EventEmitters 只能与@output 一起使用?
  • 您能否更新答案以反映如何使用 Subject/Observable?
  • 这个答案绝对是正确的。但是被标记为不好的做法(你不应该在服务上使用事件发射器)。 stackoverflow.com/questions/33380696/…
  • 那么最好的方法是什么?我想订阅我的提供者 var,但我想在提供者内部进行,否则我需要更改很多组件
猜你喜欢
  • 1970-01-01
  • 2017-06-03
  • 2017-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-01
  • 2016-06-27
相关资源
最近更新 更多