Угловой сервис для конкретного NgModule - PullRequest
1 голос
/ 30 мая 2019

Я следую Angular Documentation и пытаюсь предоставить услугу (OrderService) определенному модулю (OrdersModule).После импорта службы в компонент (OrderListComponent) я получаю сообщение об ошибке.Может кто-нибудь сказать мне, что я здесь делаю неправильно?

Вот ссылка на мой код стекаблиц.

order.service.ts

import { Injectable } from '@angular/core';
import { OrdersModule } from './orders.module';

@Injectable({
  providedIn: OrdersModule
})
export class OrderService {
  constructor() {
  }

  ...
}

order-list.component.ts

import { Component, OnInit } from '@angular/core';
import { OrderService } from '../order.service';

@Component({
  selector: 'order-list',
  templateUrl: './order-list.component.html',
  styleUrls: [ './order-list.component.css' ]
})
export class OrderListComponent implements OnInit {
  ...

  constructor(private orderService: OrderService) {
    ...
  }

  ...
}

Я получаю следующую ошибку:

Error: Uncaught (in promise): 
Error: StaticInjectorError(AppModule)[OrderListComponent -> OrderService]:
StaticInjectorError(Platform: core)[OrderListComponent -> OrderService]:
NullInjectorError: No provider for OrderService!

Ответы [ 3 ]

2 голосов
/ 30 мая 2019
  1. В большинстве случаев используйте providedIn = 'root' внутри вашего сервиса. Будет зарегистрировать сервис с инжектором корневого приложения, будет потрясен, и будет доступен для любого компонента, который нуждается в этом. Дерево дрожит будет гарантировать, что услуга включена только в пакеты, где она б.
  2. Использование массива провайдеров в компоненте, если службе требуется только быть предоставлены в компоненте и его вложенных дочерних элементах.
  3. Не рекомендуется использовать в модуле массив провайдеров.

    Используйте providedIn='OrdersModule', если хотите ограничить доступ к сервису конкретным загруженным модулем (OrdersModule). Это Затем потребуется дополнительный модуль для предотвращения циркулярной проблема зависимости.

    Это обеспечивает сервисную изоляцию в модуле. уровень. Если какой-либо другой компонент в приложении за пределами этого Ленивый загруженный модуль пытается сослаться на службу из генерируется ошибка "Область инжектора".

См. Этот ответ

0 голосов
/ 30 мая 2019

Вы должны добавить OrderService в массив providers из OrdersModule. Вот руководство, как использовать providedIn и service. https://angular.io/guide/providers#providedin-and-ngmodules

0 голосов
/ 30 мая 2019

Похоже, что открытый выпуск по этому вопросу.

И если вам нужно предоставлять услугу строго в модуле с отложенной загрузкой, как в вашем примере, тогда у вас есть два варианта:

  1. https://stackblitz.com/edit/angular-pzwmza?file=src/app/orders/orders.module.ts
  2. https://stackblitz.com/edit/angular-lazy-load-jxjhfw?file=app%2Fabout%2Fabout.service.ts
...