Перезаписать ErrorHandler для всего приложения в отдельном компоненте или маршруте - PullRequest
0 голосов
/ 31 марта 2020

У меня есть приложение Angular с настраиваемой службой регистрации и обработки ошибок, настроенной в качестве поставщика ErrorHandler для всего приложения в app.module.ts:

{ provide: ErrorHandler, useFactory: errorHandlerFactory, deps: [LogService] }

При обнаружении API ошибка в любом месте приложения, мой LogService вызывает небольшой всплывающий уведомление с помощью Toastr:

public error(title: string = 'Error', message: string, error?: any): void {
    const isServerError: boolean = this._isApiException(error);

    setTimeout(() => {
        // ... snip ...

        const toastConfig = _.cloneDeep(this._toastrService.toastrConfig);
        toastConfig.toastComponent = MyErrorToastComponent;
        const errorToast = this._toastrService.show(toastMessage, toastTitle, toastConfig);

Моя проблема в том, что у меня внезапно появился уникальный случай. Мне нужно подавить эти пузырьки на одной указанной c странице при определенных условиях, известных компоненту на этой странице. Проблема в том, что LogService перехватывает ВСЕ входящие ошибки API, без участия компонента, и до того, как служба, инициировавшая вызов API, даже видит их.

Идея 1: Я думал о переопределение ErrorHandler на уровне компонента, но очевидный подход к добавлению чего-либо в список providers компонента не сработает: Обработка ошибок на уровне компонента в Angular. Мне нужно каким-то образом контролировать инжектор и заставить его использовать другого ErrorHandler провайдера всего приложения , пока этот компонент активен. Я не уверен, возможно ли это вообще, не говоря уже о хорошей практике. Если это возможно, это очень устойчиво к Google.

Идея 2: Другая идея состоит в том, чтобы ввести маршрут в LogService и иметь черный список маршрутов, где пузырьки тостера подавляются:

const toastConfig = _.cloneDeep(this._toastrService.toastrConfig);
toastConfig.toastComponent = MyErrorToastComponent;
let errorToast: ActiveToast<any>;

if (this._routeBlacklist.indexOf(this._currentPath) === -1) {
    errorToast = this._toastrService.show(toastMessage, toastTitle, toastConfig);
}

Это кажется самым простым решением, хотя мне не нравится идея поддерживать несколько жестко закодированных маршрутов, где сообщения об ошибках не отображаются, по-видимому, волхвами c, если только вы знать о списке.

Есть ли подход, о котором я не думал? Какой лучший способ go об этом?

...