我的服务中有一个名为 refreshSubject $ 的主题。
private refreshUsers$ = new Subject<User[]>();
每次添加用户时,他都会发出新值。
saveUser(user: User[]) {
return this.http.post<User>(this.url, user)
.pipe(
tap(() => {
this.refreshUsers$.next();
})
);
}
我在服务上使用get方法来检索值
get refresh$() {
return this.refreshUsers$;
}
现在,每次添加新用户时,我都会使用 next()方法发出新值。
this.refreshUsers$.next();
在组件内部,我有自己的生命周期挂钩ngOnInit,每次 refreshUsers $ 主题发出新值时,都会调用他。
ngOnInit(): void {
this.apiService.refresh$.subscribe(() => {
this.getAllUsers();
});
}
为什么每次我订阅新值时都会调用ngOnInit?
答案 0 :(得分:3)
在onInit中,您已订阅主题,因此每次发出新值时,都会运行方法“ this.getAllUsers()”。您是否已订阅OnInit都没有关系。订阅一直有效,直到您取消订阅为止。
答案 1 :(得分:2)
无论事件位于何处,每次发出事件时,订阅都会触发。 因此,每次触发事件时,您的ngOnIt 不会被触发,但是它是“订阅”的,但是由于您的订阅在“ ngOnInIt”内部,因此它看起来像是在触发“ ngOnInIt”。 如果您不希望这样做,可以将您的订阅移出ngOnInIt外部,尽管这不会造成问题。因为您在ngOnInIt内部编写的其他逻辑不会被触发。
如果要检查自己,可以在ngOnInit内但在订阅外部添加console.log(“ testing”)。并发出多个事件,我们将注意到“测试”仅记录一次(组件加载时)
答案 2 :(得分:1)
不是...每次发出值(即此部分)时,都会调用订阅回调:
() => {
this.getAllUsers();
}
但是,每次发出值时,您并不需要进行新的订阅。
可观察性就是这样