Когда вы лениво загружаете NgModule в Angular 2, он создает контекст внедрения дочерних зависимостей для этого модуля.
Сервисы, которые вы предоставляете в этом модуле, и все сервисы, которые предоставляются в любых импортированных модулях для модуля с отложенной загрузкой, создаются заново для этого контекста внедрения дочерних зависимостей.
Это мера безопасности из-за того, что раньше в AngularJS было возможно, чтобы ленивый код мог перезаписывать глобальные службы.
Если у вас есть службы, которые хранят состояние, которое также интересно для модулей с отложенной загрузкой, у вас есть проблема, потому что вновь созданные службы в модуле с отложенной загрузкой не имеют доступа к этому состоянию.
Решение
К счастью, команда Angular знает об этом и создала для этого решение. Чтобы избежать повторного создания сервисов, которые импортированы, например, из SharedModule
, этот SharedModule
не может иметь список поставщиков в своем определении модуля.
Это возможно с помощью соглашений, введенных командой Angular: добавьте функцию static forRoot()
в ваш SharedModule
, которая возвращает тип ModuleWithProviders
. ModuleWithProviders
- это интерфейс, предоставляемый ядром Angular. Этот интерфейс ожидает два свойства:
ngModule
который содержит имя модуля, в который вы хотите добавить поставщиков, иproviders
, который содержит список поставщиков, которые обычно являются частью декоратора NgModule.
Этот SharedModule
теперь добавляется к импорту модуля корневого модуля с SharedModule.forRoot()
.
Это означает, что в объявлении SharedModule
, так сказать, напрямую нет списка поставщиков. Это означает, что модуль с отложенной загрузкой, который импортирует SharedModule, не повторно инициализирует службы, которые скрыты в функции forRoot()
для дочернего инжектора.
Если вы хотите глубже погрузиться в эту тему и увидеть пример кода, ознакомьтесь с этой отличной статьей Angular University по теме: