Внедрение услуги для указанного модуля в угловой 6+ - PullRequest
1 голос
/ 23 сентября 2019

Когда новый сервис создается с помощью angular-cli, сервис внедряется на корневом уровне с использованием декоратора @Injectable.

@Injectable({
  providedIn: 'root',
})
export class HeroService {
  constructor() { }
}

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

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

Сервисы внедряются в конструкторы компонентов, директив, сервисов и т. Д., Они предоставляются на корне, на уровне модулей или компонентов.Не существует концепции внедрения услуги на уровне модуля.Вы можете предоставлять услугу на уровне модуля, это означает, что один и тот же экземпляр этой службы будет внедрен во все элементы модуля, которые запрашивают услугу.Если ваша служба используется только в одном модуле, то предоставление ее на уровне корня или модуля вообще не имеет значения, в конечном итоге все запросы на внедрение получают один и тот же экземпляр.

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

Предоставление компонентов на уровне модуля на самом деле не является обязательным с введением в корневой каталог.

1 голос
/ 23 сентября 2019

Чтобы внедрить службу в specific module с использованием более нового синтаксиса, вы просто делаете что-то вроде этого:

import { Injectable } from "@angular/core";
import { YourModule } from "path/to/your.module";

@Injectable({
    providedIn: YourModule
})
export class SomeModuleScopedService {}

или вы можете сделать это с помощью команды angular cli,

ng g s services/testService --module=services/services.module
...