Angular: инъекция маршрутизатора в конструктор, выдающая ошибку - PullRequest
0 голосов
/ 24 ноября 2018

Я пытаюсь создать глобальный компонент обработки ошибок, и для этого я предоставляю собственный класс ErrorHandler.Я хочу внедрить Маршрутизатор через конструктор в error.service.ts, чтобы я мог перейти к компоненту ошибки, но он не работает с ошибкой, приведенной ниже.

compiler.js: 18429 Неопределенная ошибка: ошибки синтаксического анализа поставщика: Не удается создать экземпляр циклической зависимости!ApplicationRef ("[ERROR ->]"): в NgModule AppModule в ./AppModule@-1:-1

Вот ссылка на проект.https://stackblitz.com/edit/angular-q56xm8

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

1 Ответ

0 голосов
/ 25 ноября 2018

Давайте попробуем понять это на примере того, что происходит внутри, когда вы регистрировали свой собственный обработчик ошибок.

Чтобы зарегистрировать обработчик ошибок, вы сделали что-то вроде:

class MyErrorHandler implements ErrorHandler {
  handleError(error) {
    // do something with the exception
  }
}

@NgModule({
  providers: [{provide: ErrorHandler, useClass: MyErrorHandler}]
})
class MyModule {}

Сейчасто, что он сделал, теперь он использует ваш класс MyErrorHAndler вместо ErrorHandler.

класса Angular. Так что, скажем, в случае маршрутизатора ему нуженэкземпляр службы MyErrorHandler, чтобы создать свой собственный экземпляр.Таким образом, инжектор будет искать экземпляр MyErrorHandler для создания экземпляра Router.

Инжектор не имеет экземпляра службы MyErrorHandler (вместо обычного * 1020).*) поэтому он попытается создать его, чтобы он мог предоставить его Router.Но как только он пытается создать экземпляр MyErrorHandler, он видит, что в конструкторе MyErrorHandler есть Router.Таким образом, он проверит экземпляр Router, который он может внедрить в constructor из MyErrorHandler.Но он не находит ни одного, поскольку Router был тем, что он пытался создать вначале.

TL; DR;: Угловой для создания экземпляра Router нужен экземпляр MyErrorHandler.И чтобы создать экземпляр MyErrorHandler, ему нужен экземпляр Router.Это создает ситуацию, когда MyErrorHandler зависит от Router, а Router зависит от MyErrorHandler, тем самым создавая круговую зависимость.

Исправление: Как вы уже сделали это на своемсобственный, исправление должно использовать Injector.Когда вы используете это, для создания экземпляра MyErrorHandler Angular больше не нужно будет вставлять в него экземпляр Router.Следовательно, в этом случае не будет никакой циклической зависимости.

...