You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular全局展示API错误横幅:拦截器已就绪,求实现方案

实现Angular全应用全局错误横幅(基于Interceptor捕获API错误)

1. 创建全局错误状态服务

通过服务维护错误状态,用BehaviorSubject实现跨组件的状态同步,确保横幅能实时响应错误变化:

// error.service.ts
import { Injectable } from '@angular/core';
import { BehaviorSubject, Observable } from 'rxjs';

@Injectable({ providedIn: 'root' })
export class ErrorService {
  private errorSubject = new BehaviorSubject<string | null>(null);
  public error$: Observable<string | null> = this.errorSubject.asObservable();

  setError(message: string): void {
    this.errorSubject.next(message);
  }

  clearError(): void {
    this.errorSubject.next(null);
  }
}

2. 创建全局错误横幅组件

生成组件并订阅错误服务的状态,实现显示/隐藏逻辑和关闭功能:

// global-error-banner.component.ts
import { Component, OnInit } from '@angular/core';
import { ErrorService } from '../error.service';

@Component({
  selector: 'app-global-error-banner',
  templateUrl: './global-error-banner.component.html',
  styleUrls: ['./global-error-banner.component.css']
})
export class GlobalErrorBannerComponent implements OnInit {
  currentError: string | null = null;

  constructor(private errorService: ErrorService) {}

  ngOnInit(): void {
    this.errorService.error$.subscribe(error => {
      this.currentError = error;
    });
  }

  onClose(): void {
    this.errorService.clearError();
  }
}

组件模板(global-error-banner.component.html):

<div *ngIf="currentError" class="error-banner">
  <span>{{ currentError }}</span>
  <button (click)="onClose()" class="close-btn">&times;</button>
</div>

基础样式(global-error-banner.component.css):

.error-banner {
  background-color: #dc3545;
  color: #fff;
  padding: 1rem;
  display: flex;
  justify-content: space-between;
  align-items: center;
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 1000;
}

.close-btn {
  background: transparent;
  border: none;
  color: #fff;
  font-size: 1.5rem;
  cursor: pointer;
}

3. 挂载横幅到根组件

打开app.component.html,将横幅组件放在路由出口上方,确保所有页面都能显示:

<app-global-error-banner></app-global-error-banner>
<router-outlet></router-outlet>

4. 在Interceptor中触发错误提示

修改已有的Interceptor,在捕获GET请求错误时调用错误服务的方法:

// api.interceptor.ts
import { Injectable } from '@angular/core';
import { HttpInterceptor, HttpRequest, HttpHandler, HttpErrorResponse } from '@angular/common/http';
import { catchError } from 'rxjs/operators';
import { throwError } from 'rxjs';
import { ErrorService } from './error.service';

@Injectable()
export class ApiInterceptor implements HttpInterceptor {
  constructor(private errorService: ErrorService) {}

  intercept(request: HttpRequest<any>, next: HttpHandler) {
    if (request.method === 'GET') {
      return next.handle(request).pipe(
        catchError((error: HttpErrorResponse) => {
          const errorMsg = error.status === 404 ? '请求资源不存在' : '数据加载失败,请稍后重试';
          this.errorService.setError(errorMsg);
          // 继续抛出错误,允许组件层面做额外处理
          return throwError(() => error);
        })
      );
    }
    return next.handle(request);
  }
}

额外优化点

  • 可根据HTTP错误状态码(如401、500)设置不同提示文案
  • 给错误横幅添加自动隐藏逻辑:在ErrorService的setError方法中加入定时器,一段时间后自动调用clearError
  • 调整横幅样式适配项目UI设计

内容的提问来源于stack exchange,提问作者CBP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 15:25:41