该问题可以通过使用 BehaviorSubject 来解决。BehaviorSubject 可以保存最新的值,并且在有新的观察者订阅时,会将当前值发送给订阅者。
首先,在组件中创建一个 BehaviorSubject,并将其注入到服务中,以便在组件之间共享数据。在服务中,可以使用 BehaviorSubject 的值来更新消息。
接下来,在组件中订阅该 BehaviorSubject,并更新消息。但是,在消息更新之前,需要检查 ErrorHandler 是否已被触发。如果 ErrorHandler 已被触发,则需要手动调用 ChangeDetectorRef.detectChanges() 方法以触发 Angular 的变更检测。
示例代码如下:
在服务中:
import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class MessageService {
private messageSource = new BehaviorSubject("");
currentMessage = this.messageSource.asObservable();
updateMessage(message: string) {
this.messageSource.next(message);
}
}
在组件中:
import { Component } from '@angular/core';
import { MessageService } from './message.service';
import { ErrorHandler, Injectable } from '@angular/core';
import { ChangeDetectorRef } from '@angular/core';
@Injectable()
export class GlobalErrorHandler implements ErrorHandler {
constructor(private cdr: ChangeDetectorRef) {}
handleError(error: any) {
// handle error here
this.cdr.detectChanges(); // trigger change detection
}
}
@Component({
selector: 'app-root',
template: `
{{ message }}
`,
providers: [
{ provide: ErrorHandler, useClass: GlobalErrorHandler }
]
})
export class AppComponent {
message: string;
constructor(private messageService: MessageService) {}
ngOnInit() {
this.messageService.currentMessage.subscribe(message => {
this.message = message;
});
}
updateMessage() {
// check if ErrorHandler was triggered
if (this.message === "") {
this.messageService.updateMessage("Message updated on first click.");
} else {
this.messageService.updateMessage("Message updated on second click.");
}
}
}