Когда вы лениво загружаете NgModule в Angular 2, он создает контекст внедрения дочерних зависимостей для этого модуля.

Сервисы, которые вы предоставляете в этом модуле, и все сервисы, которые предоставляются в любых импортированных модулях для модуля с отложенной загрузкой, создаются заново для этого контекста внедрения дочерних зависимостей.

Это мера безопасности из-за того, что раньше в AngularJS было возможно, чтобы ленивый код мог перезаписывать глобальные службы.

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

Решение

К счастью, команда Angular знает об этом и создала для этого решение. Чтобы избежать повторного создания сервисов, которые импортированы, например, из SharedModule, этот SharedModule не может иметь список поставщиков в своем определении модуля.

Это возможно с помощью соглашений, введенных командой Angular: добавьте функцию static forRoot() в ваш SharedModule, которая возвращает тип ModuleWithProviders. ModuleWithProviders - это интерфейс, предоставляемый ядром Angular. Этот интерфейс ожидает два свойства:

  1. ngModule который содержит имя модуля, в который вы хотите добавить поставщиков, и
  2. providers, который содержит список поставщиков, которые обычно являются частью декоратора NgModule.

Этот SharedModule теперь добавляется к импорту модуля корневого модуля с SharedModule.forRoot().

Это означает, что в объявлении SharedModule, так сказать, напрямую нет списка поставщиков. Это означает, что модуль с отложенной загрузкой, который импортирует SharedModule, не повторно инициализирует службы, которые скрыты в функции forRoot() для дочернего инжектора.

Если вы хотите глубже погрузиться в эту тему и увидеть пример кода, ознакомьтесь с этой отличной статьей Angular University по теме: