【发布时间】:2026-01-04 01:25:02
【问题描述】:
我设置了一个service 来跟踪登录用户。该服务返回一个 Observable,并通知所有 subscribe 给它的组件(目前只有一个组件订阅它)。
服务:
private subject = new Subject<any>();
sendMessage(message: boolean) {
this.subject.next( message );
}
getMessage(): Observable<any> {
return this.subject.asObservable();
}
根应用组件:(此组件订阅可观察对象)
ngAfterViewInit(){
this.subscription = this._authService.getMessage().subscribe(message => { this.user = message; });
}
欢迎组件:
ngOnInit() {
const checkStatus = this._authService.checkUserStatus();
this._authService.sendMessage(checkStatus);
}
App Component Html:(这是发生错误的地方)
<div *ngIf="user"><div>
我想做的事:
我希望每个组件(根应用程序组件除外)都将用户登录状态发送到根应用程序组件,以便我可以在根应用程序组件 Html 中操作 UI。
问题:
欢迎组件初始化时出现以下错误。
Expression has changed after it was checked. Previous value: 'undefined'. Current value: 'true'.
请注意此错误发生在位于根应用程序组件 HTML 文件中的 *ngIf="user" 表达式上。
谁能解释这个错误的原因以及我该如何解决这个问题?
附带说明:如果您认为有更好的方法来实现我想要做的事情,请告诉我。
更新 1:
将以下内容放入constructor 可以解决问题,但不想为此目的使用constructor,因此这似乎不是一个好的解决方案。
欢迎组件:
constructor(private _authService: AuthenticationService) {
const checkStatus = this._authService.checkUserStatus();
this._authService.sendMessage(checkStatus);
}
根应用组件:
constructor(private _authService: AuthenticationService){
this.subscription = this._authService.getMessage().subscribe(message => { this.usr = message; });
}
更新 2:
这是plunkr。要查看错误,请检查浏览器控制台。当应用程序加载时,应该显示一个布尔值 true,但我在控制台中收到错误。
请注意,这个 plunkr 是我的主应用程序的一个非常基本的版本。由于应用程序有点大,我无法上传所有代码。但是 plunkr 完美地证明了这个错误。
【问题讨论】:
-
你好@SkyWalker,我回答了你的问题,没有任何问题。我根本没有应用hack。您可以查看此博客,其中解释了您对更改检测如何工作的疑问。 1) blog.thoughtram.io/angular/2016/02/22/… 2) juristr.com/blog/2017/03/angular-tuning-change-detection 谢谢
标签: javascript angular typescript rxjs