Angular - 为什么每次发出新值时都会调用 ngOnInit?
Angular - Why ngOnInit is called every time i emit a new value?
我的服务中有一个名为 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?
不是...每次发出值时都会调用订阅回调,即这部分:
() => {
this.getAllUsers();
}
但您并不是在每次发出值时都进行新订阅。
Observables 就是这样工作的
在 onInit 中,您订阅了您的主题,因此每次您发出新值时,方法 "this.getAllUsers()" 都会运行。您是否订阅了 OnInit 并不重要。在您取消订阅之前,订阅一直有效。
无论事件发生在何处,订阅都会在每次发出事件时触发。
所以你的 ngOnIt 是 而不是 每次触发事件时都会触发,但它是 "subscribe",但由于你的订阅在 "ngOnInIt" 内,它看起来像 "ngOnInIt" 被触发。
如果你不想要这个,你可以将你的订阅移到 ngOnInIt 之外,尽管它不会产生问题。因为您在 ngOnInIt 中编写的其他逻辑不会被触发。
如果你想自己检查,你可以在你的 ngOnInit 中但在订阅之外添加一个 console.log("testing") 。并发出多个事件我们会注意到 'testing' 将只记录一次(当组件加载时)
我的服务中有一个名为 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?
不是...每次发出值时都会调用订阅回调,即这部分:
() => {
this.getAllUsers();
}
但您并不是在每次发出值时都进行新订阅。
Observables 就是这样工作的
在 onInit 中,您订阅了您的主题,因此每次您发出新值时,方法 "this.getAllUsers()" 都会运行。您是否订阅了 OnInit 并不重要。在您取消订阅之前,订阅一直有效。
无论事件发生在何处,订阅都会在每次发出事件时触发。 所以你的 ngOnIt 是 而不是 每次触发事件时都会触发,但它是 "subscribe",但由于你的订阅在 "ngOnInIt" 内,它看起来像 "ngOnInIt" 被触发。 如果你不想要这个,你可以将你的订阅移到 ngOnInIt 之外,尽管它不会产生问题。因为您在 ngOnInIt 中编写的其他逻辑不会被触发。
如果你想自己检查,你可以在你的 ngOnInit 中但在订阅之外添加一个 console.log("testing") 。并发出多个事件我们会注意到 'testing' 将只记录一次(当组件加载时)