У меня есть приложение 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 об этом?