угловая инъекция 6 зависимостей - PullRequest
0 голосов
/ 07 мая 2018

В последнем выпуске Angular 6 служба регистрируется в модуле с использованием свойства providedIn в метаданных службы:

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

Однако в документации по-прежнему также упоминается регистрация службы вмодуль providers массив в метаданных модуля, как мы это делали в Angular 5:

@NgModule({
  providers: [HeroService],
})
export class AppModule {}

Итак,

  • Какой метод должен использоваться, чтобы инжектор знал о сервисечто он должен внедрить?
  • Будет ли устаревать метод массива модуля providers?

Ответы [ 4 ]

0 голосов
/ 21 января 2019

Декораторы @NgModule() и @Component() имеют опцию метаданных провайдеров, где вы можете настроить провайдеров для инжекторов уровня NgModule или уровня компонента.

Декоратор @Injectable () имеет опцию метаданных обеспеченных в, где вы можете указать поставщика декорированного класса обслуживания с корневым инжектором или с инжектором для конкретного NgModule.

В вашем случае, поскольку он был предоставлен на уровне «root», нет необходимости снова добавлять его в качестве поставщика в модуле.

Подробнее о Внедрение зависимостей здесь

0 голосов
/ 07 мая 2018

В основном вы можете использовать любой из них, но в соответствии с новым CLI provideIn будет автоматически добавлено при создании service

providedIn

Теперь существует новый, рекомендуемый способ регистрации поставщика напрямую внутри @Injectable() декоратора, используя новый приписывать. Он принимает 'root' в качестве значения или любого модуля вашего приложение. Когда вы используете 'root', ваш инъекционный будет зарегистрирован в приложении, и вам не нужно добавлять его в провайдеры корневого модуля. Точно так же, если вы используете providedIn: UsersModule, инъекционный препарат зарегистрирован как поставщик UsersModule без добавления его к поставщикам модуля.

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

Для получения дополнительной информации, пожалуйста, обращайтесь сюда

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

Если вы используете Angular 5+ Developer, он автоматически создаст инъецируемую службу, когда будет объявлена ​​как обеспечено в: 'root', в этом случае вам не потребуется импортировать службу в app.module.ts. Вы можете напрямую использовать его в другом компоненте.

0 голосов
/ 07 мая 2018

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

Иногда нежелательно, чтобы услуга всегда предоставлялась в корневой инжектор приложения. Возможно, пользователям следует явно отказаться использовать сервис, или услуга должна быть предоставлена ​​в лениво загруженный контекст. В этом случае провайдер должен быть связан с конкретным @NgModule class, и будет использоваться любым Инжектор включает в себя этот модуль.

Таким образом, в основном вы будете использовать providedIn: 'root' для любых служб, охватывающих все приложения. Для других сервисов продолжайте использовать старую версию.

Не забывайте, что у вас уже был выбор предоставлять услуги по-другому. Например, также возможно объявить Injectable на уровне компонента (это не меняется в V6).

  @Component({
    selector: 'app-my-component',
    templateUrl: './my.component.html',
    providers: [ MyService ]
  })

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

...