SnackBar не отображается при использовании внутри HTTPInterceptor - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь написать глобальный 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");
          });
    }
}

Я пытался вытащить зону, а не использовать инжектор.Без изменений.

1 Ответ

0 голосов
/ 20 октября 2018

Так что я как-то наткнулся на ответ, клонирование запроса заставило закусочную работать корректно.Странно.

Я понимаю необходимость клонировать запрос с точки зрения модифицируемости / сходимости, но для того, чтобы повлиять на снэк-бар, потребуются лучшие умы, чем мои, чтобы объяснить.

Итак, в заключение,тем, кто бродит по этому странному нику из леса, добавление этой строки в начало функции intercept () заставило ее работать:

request = request.clone ();

...