我有一个奇怪的问题,角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
有关。
答案 0 :(得分:0)
我终于找到了发生这种情况的原因。
原因是在父构造函数中,$dateChange
有一个值,因此它可以解析,因此调用this.load();
。因此,此代码按以下顺序运行:
load
方法(因此console.log(this.x, this.y);
在这里运行)x = 0;
在这里运行)这是因为ReplaySubject
有一个缓冲区,所以它具有值,因此,它立即在父构造函数中解析。