SnackBar 在 HTTPInterceptor 中使用时不显示

Posted

技术标签:

【中文标题】SnackBar 在 HTTPInterceptor 中使用时不显示【英文标题】:SnackBar not showing when used inside HTTPInterceptor 【发布时间】:2019-03-24 15:21:02 【问题描述】:

我正在尝试编写一个全局 HTTP 拦截器,它拦截所有 HTTP 响应、检查响应并(如果满足某些条件)显示一个快餐栏。

我似乎无法显示小吃店。如果我在 .open() 行设置断点,我会看到小吃栏出现片刻,但没有任何文本且偏离中心。

拦截器:

import  Injectable, Injector, NgZone  from '@angular/core';
import     
    HttpEvent,
    HttpHandler,
    HttpInterceptor,
    HttpRequest,
    HttpResponse,
 from '@angular/common/http';
import  Observable, of  from 'rxjs';
import  tap  from 'rxjs/operators';

import  MatSnackBar  from '@angular/material';
//import  of  from 'rxjs/observable/of';

@Injectable()
export class TMCErrorHttpInterceptor implements HttpInterceptor 
    constructor(public snackBar: MatSnackBar,private injector: Injector, private zone: NgZone)
    /**
      * @param HttpRequest<any> request - The intercepted request
      * @param HttpHandler next - The next interceptor in the pipeline
      * @return Observable<HttpEvent<any>>
      */
    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> 
        const started = Date.now();
        return next.handle(request)
            // add error handling
            .pipe(
                tap(event => 
                    if (event instanceof HttpResponse)                         
                        if (this.isError(event.body))
                            this.handleError(event.body);                                          
                        
                    
                , error => 
                    console.error('NICE ERROR', error)
                )
            );
    
    isError(response: any): any 
        return (typeof (response) == "object"
            && typeof (response.MESSAGE) != "undefined"
            && typeof (response.STATUS) != "undefined"
            && typeof (response.CODE) != "undefined"
            && response.STATUS === "error"
        );
    
    handleError(error: any): any 
        this.snackBar = this.injector.get(MatSnackBar);
        this.zone.run(() => 
            this.snackBar.open("hiiiiii");
          );
    

我已尝试取出该区域,但不使用注射器。没有变化。

【问题讨论】:

Snackbar position wrong when use errorhandler in angular 5 and material的可能重复 【参考方案1】:

所以我以某种方式偶然发现了答案,克隆请求使小吃店正常工作。奇怪。

我理解从可修改性/可链接性的角度克隆请求的必要性,但要影响快餐栏需要比我更好的头脑来解释。

因此,总而言之,对于那些徘徊在这个奇怪的森林尼克的人来说,将这一行添加到拦截 () 函数的顶部就可以了:

request = request.clone();

【讨论】:

以上是关于SnackBar 在 HTTPInterceptor 中使用时不显示的主要内容,如果未能解决你的问题,请参考以下文章

在 MUI 中设置 Snackbar 的背景颜色

Android - MD之Snackbar的使用

Snackbar 在操作点击时不会被关闭

防止 Snackbar 在操作单击时关闭

如何在颤动中显示 SnackBar?

Snackbar 的高度自定义