Angular 问题中的全球消息服务
Global Messaging service in Angular problems
我正在使用 angular 7 开发 Web 应用程序,目前我正在尝试使用 Api 拦截器来显示发生错误的警报,但是它工作正常,添加消息服务和消息组件后,我尝试使用消息推送错误消息(在组件模板中按照我想要的格式设置消息格式)但是,它不起作用并且没有给我任何错误。无论如何,这是代码
Api Interceptor.ts
return next.handle(apiReq).pipe(
retry(3),
catchError(this.handleError)
);
}
handleError(error: HttpErrorResponse) {
let errorMessage = '';
if (error.error instanceof ErrorEvent) {
//client Side Error
errorMessage = `Error: ${error.error.message}`;
} else {
//server side
errorMessage = `Error: ${error.status}\nMessage: ${error.message}`;
}
window.alert(errorMessage);
console.log('An Error has Occured');
this.messageService.add(errorMessage);
return throwError(errorMessage);
}
}
这是拦截的最后一部分,也是 handleError 方法的开始部分。
message.service.ts
export class MessageService {
messages: string[] = [];
add(message: string) {
this.messages.push(message);
}
clear() {
this.messages = [];
}
constructor() { }
}
messages.component.ts
export class MessagesComponent implements OnInit {
constructor(public messageService:MessageService) { }
ngOnInit() {
}
}
messages.component.html
<div *ngIf="messageService.messages.length">
<h2>Messages</h2>
<button class="clear"
(click)="messageService.clear()">clear</button>
<div *ngFor='let message of messageService.messages'> {{message}} </div>
</div>
我的目标是显示 messages.component 中动态格式化并由 Api 拦截器中注入的服务推送的错误消息。
谢谢
如下在您的 messageService
中创建一个 Subject
,当错误被添加到 messages
数组时,您应该使用消息数组调用 next()
方法。
export class MessageService {
messages: string[] = [];
messages$: new Subject<any>();
add(message: string) {
this.messages.push(message);
this.messages$.next(this.messages);
}
clear() {
this.messages = [];
}
constructor() { }
}
在您的组件中,只要将消息添加到消息数组中,您就应该更新 DOM,因此您必须按如下方式订阅 message$
主题
export class MessagesComponent implements OnInit {
public messages: Array<any> = [];
constructor(public messageService:MessageService) { }
ngOnInit() {
this.messageService.messages$.subscribe(messages => this.messages = messages);
}
}
你html应该
<div *ngIf="messages.length">
<h2>Messages</h2>
<button class="clear"
(click)="messageService.clear()">clear</button>
<div *ngFor='let message of messages'> {{message}} </div>
</div>
我正在使用 angular 7 开发 Web 应用程序,目前我正在尝试使用 Api 拦截器来显示发生错误的警报,但是它工作正常,添加消息服务和消息组件后,我尝试使用消息推送错误消息(在组件模板中按照我想要的格式设置消息格式)但是,它不起作用并且没有给我任何错误。无论如何,这是代码
Api Interceptor.ts
return next.handle(apiReq).pipe(
retry(3),
catchError(this.handleError)
);
}
handleError(error: HttpErrorResponse) {
let errorMessage = '';
if (error.error instanceof ErrorEvent) {
//client Side Error
errorMessage = `Error: ${error.error.message}`;
} else {
//server side
errorMessage = `Error: ${error.status}\nMessage: ${error.message}`;
}
window.alert(errorMessage);
console.log('An Error has Occured');
this.messageService.add(errorMessage);
return throwError(errorMessage);
}
}
这是拦截的最后一部分,也是 handleError 方法的开始部分。
message.service.ts
export class MessageService {
messages: string[] = [];
add(message: string) {
this.messages.push(message);
}
clear() {
this.messages = [];
}
constructor() { }
}
messages.component.ts
export class MessagesComponent implements OnInit {
constructor(public messageService:MessageService) { }
ngOnInit() {
}
}
messages.component.html
<div *ngIf="messageService.messages.length">
<h2>Messages</h2>
<button class="clear"
(click)="messageService.clear()">clear</button>
<div *ngFor='let message of messageService.messages'> {{message}} </div>
</div>
我的目标是显示 messages.component 中动态格式化并由 Api 拦截器中注入的服务推送的错误消息。
谢谢
如下在您的 messageService
中创建一个 Subject
,当错误被添加到 messages
数组时,您应该使用消息数组调用 next()
方法。
export class MessageService {
messages: string[] = [];
messages$: new Subject<any>();
add(message: string) {
this.messages.push(message);
this.messages$.next(this.messages);
}
clear() {
this.messages = [];
}
constructor() { }
}
在您的组件中,只要将消息添加到消息数组中,您就应该更新 DOM,因此您必须按如下方式订阅 message$
主题
export class MessagesComponent implements OnInit {
public messages: Array<any> = [];
constructor(public messageService:MessageService) { }
ngOnInit() {
this.messageService.messages$.subscribe(messages => this.messages = messages);
}
}
你html应该
<div *ngIf="messages.length">
<h2>Messages</h2>
<button class="clear"
(click)="messageService.clear()">clear</button>
<div *ngFor='let message of messages'> {{message}} </div>
</div>