使用Angular 5 ReplaySubject,'这个'没有正确继承

时间:2018-02-17 12:06:49

标签: angular typescript

我有一个奇怪的问题,角5和打字稿(所以我的问题的标题可能不正确)。

我有这个代码并且有效:

日历服务

_$dateChange: EventEmitter<object>;
constructor() {
    this._$dateChange = new EventEmitter<object>();
}
get $dateChange() {
    return this._$dateChange;
}
public calendarChanged(): void {
    this._$dateChange.emit({});
}

...
y = 2;
constructor() {
    this.calendarService.$dateChange.subscribe(item => {
      this.load();
    })
}
abstract load();

eventsComponent

export class EventsComponent extends ParentComponent {
    x = 0;
    load() {
         console.log(this.x, this.y); // consoles 0 2
    }
}

然后我读了this answer并发现我需要使用ReplaySubject。另外我注意到在其他地方还有一个问题。

然后我改变了我的代码。我将EventEmitter替换为ReplaySubject,将emit替换为next。这是修改后的代码:(仅更改日历服务)

日历服务

_$dateChange: ReplaySubject<object>;
constructor() {
    this._$dateChange = new ReplaySubject<object>();
}
get $dateChange() {
    return this._$dateChange;
}
public calendarChanged(): void {
    this._$dateChange.next({});
}

console.log的结果是undefined 2!所以我用this.load().bind(this)并没有改变任何东西。我还尝试使用像load = () => {}这样的箭头函数,然后它给出了the function load doesn't exist的错误。

我无法理解问题是什么,但我认为它可能与ReplaySubject有关。

1 个答案:

答案 0 :(得分:0)

我终于找到了发生这种情况的原因。

原因是在父构造函数中,$dateChange有一个值,因此它可以解析,因此调用this.load();。因此,此代码按以下顺序运行:

  1. 父级构造函数
  2. load方法(因此console.log(this.x, this.y);在这里运行)
  3. eventsComponent属性的初始化(因此,x = 0;在这里运行)

这与ReplaySubject有什么关系?

这是因为ReplaySubject有一个缓冲区,所以它具有值,因此,它立即在父构造函数中解析。