Насколько мне известно, до angular 6 все поставщики @Ngmodule были зарегистрированы на корневом инжекторе и обслуживались в основном пакете, даже если их использовали только ленивые загруженные модули.
Единственным исключением из этого правила было то, что мы хотели создавать не одноэлементные службы на уровне компонентов.
Я хочу создать одноэлементную службу, которая будет видна только определенному модулю (а не корневому модулю), и в результате этого не будет обслуживаться в основном загруженном пакете.
Мы видели, что в angular 6 модулю больше не нужно будет ссылаться на службу через «провайдеров», а теперь служба будет ссылаться на модуль.
Это можно сделать с помощью аннотации @Injectable и атрибута provideIn.
Я не нашел хорошего и ясного примера того, как я могу добавить имя модуля, которое не является root, что-то вроде этого:
@Injectable({ provideIn: <MyLocalModule>})
export class SimpleServiceForLocalUseOnly { […] }Импорт модуля LazyLoaded и запись его как «MyLocalModule» в приведенном выше фрагменте вызывает ПРЕДУПРЕЖДЕНИЕ о круговой зависимости. Я могу решить эту проблему, переместив службу в другой модуль, но тогда я теряю свою первоначальную цель.
Список искомых ссылок:
https://blog.angular.io/version-6-of-angular-now-available-cc56b0efa7a4
https://jaxenter.com/new-angular6-143995.html
https://www.ngdevelop.tech/angular-6-features/
https://blog.ninja-squad.com/2018/05/04/what-is-new-angular-6/
http://ankitsharmablogs.com/getting-started-with-angular-6-0/





Кажется, есть некоторые проблемы с круговой зависимостью, если мы будем следовать этой настройке в соответствии с официальные документы:
import { Injectable } from '@angular/core';
import { HeroModule } from './hero.module';
import { HEROES } from './mock-heroes';
@Injectable({
// we declare that this service should be created
// by any injector that includes HeroModule.
providedIn: HeroModule,
})
export class HeroService {
getHeroes() { return HEROES; }
}
Вы можете игнорировать предупреждения, которые генерирует компилятор из-за циклической зависимости между модулем, службой и компонентом. Или вернитесь к предыдущим методам, используемым в Angular 5.
Зарегистрируйте сервис как провайдера в модуле с отложенной загрузкой, обратите внимание, что вы не должны импортировать модули с отложенной загрузкой в модуль корневого приложения:
@NgModule({
imports: [
RouterModule.forChild([{ path: '', component: LazyComponent }]),
],
declarations: [
LazyComponent
],
providers: [YourServiceHere]
})
export class LazyLoadedModule { }
это может быть проблема с самой библиотекой Angular, в основном потому, что для этой настройки требуется циклический импорт службы, модуля и компонента. Если это просто ПРЕДУПРЕЖДЕНИЕ, и ваше приложение работает, я думаю, что его можно игнорировать. Или вы могли бы просто не использовать способ настройки сервисов на уровне модуля. Просто настройте службу в массиве поставщиков в вашем ленивом загружаемом модуле.
Но моей первоначальной целью было не включать эту услугу в основной пакет, добавление ее в массив поставщиков модулей приведет к такому результату.
вы ленивы загружаете свой модуль? Насколько я понимаю, службы, зарегистрированные в модулях с ленивой загрузкой, также загружаются лениво.
Да, этот модуль загружается лениво, и службы, зарегистрированные в «провайдерах» модуля, добавляются в корневой инжектор и не загружаются лениво (проверьте, что вы основной пакет, и посмотрите). Насколько я понимаю, в angular 6 он был изменен (во второй ссылке есть хорошая обложка).
Я понимаю. Возможно, нам придется игнорировать предупреждения, пока новая версия не решит эту проблему. Извини, что не смог тебе с этим помочь.
Здравствуйте, я сам убедился, что сервисы, зарегистрированные в модулях с отложенной загрузкой, не входят в основной пакет. Добавлю настройку в ответ.
Вы с угловой 6? Значит, идет из коробки?
Чтобы предоставить услугу в конкретном модуле с использованием нового синтаксиса, вам просто нужно сделать что-то вроде этого:
import { Injectable } from "@angular/core";
import { YourModule } from "path/to/your.module";
@Injectable({
providedIn: YourModule
})
export class SomeModuleScopedService {}
ссылка: https://angular.io/guide/providers#providedin-and-ngmodules
Он дает предупреждение о циклической зависимости, как указано в вопросе.
Я заставил это работать, создав промежуточный модуль, который содержит только службу.
import { Injectable } from '@angular/core';
import { HeroServiceModule } from './hero.service.module';
@Injectable({
providedIn: HeroServiceModule,
})
export class HeroService {
}
В этом модуле много не нужно:
@NgModule({
imports: [ CommonModule ]
})
export class HeroServiceModule {}
Затем ваш обычный модуль импортирует служебный модуль:
@NgModule({
...
imports: [
...
HeroServiceModule
]
})
export class HeroModule {}
Затем вы можете отложить загрузку HeroModule как обычно. Это устраняет все циклические зависимости.
Когда я это делаю, я получаю: ПРЕДУПРЕЖДЕНИЕ в обнаружении круговой зависимости: HeroService -> HeroModule -> HeroComponent -> HeroService