Угловой 6 Обработка ошибок не показывает тосты

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

Есть идеи, что может быть причиной такого поведения?

import { Injectable, ErrorHandler, Injector } from '@angular/core';
import { Router } from '@angular/router';
import { HttpErrorResponse } from '@angular/common/http';
import { ToastrService } from 'ngx-toastr';
import { AppSettings } from '../../app.settings';

@Injectable()
export class GlobalErrorHandler implements ErrorHandler {

  constructor(private injector: Injector) {}

  public handleError(error: any) {

    const router = this.injector.get(Router);
    const settings = this.injector.get(AppSettings)

    const toastr = this.injector.get(ToastrService);

    console.log(`Request URL: ${router.url}`);
    console.log(error);
    if (error instanceof HttpErrorResponse) {
      console.log("it is");
      if (error.status === 401) {
        router.navigate(['/login']);
        settings.settings.setLoadingSpinner(false);
        toastr.error('Logged in user no longer authenticated on server.', 'Unable to connect to server');
      } else if (error.status === 404) {
        console.log("it is 404");
        toastr.error('Unable to connect to server. Missing or wrong URL, please try again', 'Unable to connect to server');
        settings.settings.setLoadingSpinner(false);
      } else if (error.status === 0) {
        toastr.error('Server appears to be temporary unavailable', 'Unable to connect to server');
        settings.settings.setLoadingSpinner(false);
      } else if (error.status === 500) {
        toastr.error('Server appears to be temporary unavailable', 'Unable to connect to server');
        settings.settings.setLoadingSpinner(false);
      }

    } else {
      console.error(error);
      toastr.error('An error has occured', 'Sorry');

    }

  }

}

Я добавил провайдера в модуль, чтобы использовать этот класс в качестве обработчика ошибок.

1 ответ

Я считаю, что вы можете импортировать и включать NgZone в вашем конструкторе, чтобы эта работа работала по назначению:

constructor(private injector: Injector, private zone: NgZone) {}

Затем заверните toastr звонки:

this.zone.run(() => toastr.error('message', 'title'));

Пожалуйста включите тостер в конструктор и запустите. Насколько я понимаю, в то время как сервис создается, тостер должен быть инициирован.

Другие вопросы по тегам