Angular зависимость от "providedIn" в модулях с отложенной загрузкой - PullRequest
0 голосов
/ 17 июня 2020

Я использую Angular «Модули функций с отложенной загрузкой» в качестве примера: живая демонстрация

CustomersModule - модуль отложенной загрузки Я создаю тест обслуживание в модуле клиента.

const routes: Routes = [
  {
    path: 'customers',
    loadChildren: () => import('./customers/customers.module').then(m => m.CustomersModule)
  },
  {
    path: 'orders',
    loadChildren: () => import('./orders/orders.module').then(m => m.OrdersModule)
  },
  {
    path: '',
    redirectTo: '',
    pathMatch: 'full'
  }
];
import { Injectable } from '@angular/core';

@Injectable()
export class TestService {
  constructor() { }

  getHeroes() { return "HEROES"; }
}

в модуле CustomersModule, добавьте его к поставщикам:

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { CustomersRoutingModule } from './customers-routing.module';
import { CustomersComponent } from './customers.component';
import {TestService} from "./test.service";

@NgModule({
  imports: [
    CommonModule,
    CustomersRoutingModule
  ],
  providers: [
    TestService
  ],
  declarations: [CustomersComponent]
})
export class CustomersModule { }

Модуль CustomersModule также имеет CustomersComponent , таким образом я может использовать в нем TestService.

import { Component, OnInit } from '@angular/core';
import {TestService} from "./test.service";

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


   testService: TestService;

  constructor(test: TestService) {
    this.testService = test;
  }

  ngOnInit() {
  }

  test(){
    console.log(this.testService.getHeroes());
  }
}

, но когда я удаляю TestService из массива поставщиков CustomersModule и использую providedIn в TestService:

import { Injectable } from '@angular/core';
import {CustomersModule} from "./customers.module";

@Injectable({
  providedIn: CustomersModule
})
export class TestService {
  constructor() { }

  getHeroes() { return "HEROES"; }
}

, я получил эту ошибку:

core.js:6228 ERROR Error: Uncaught (in promise): ReferenceError: Cannot access 'CustomersModule' before initialization
ReferenceError: Cannot access 'CustomersModule' before initialization
    at Module.CustomersModule (customers.component.ts:9)
    at Module../src/app/customers/test.service.ts (test.service.ts:5)
    at __webpack_require__ (bootstrap:84)
    at Module../src/app/customers/customers.component.ts (customers-customers-module.js:78)
    at __webpack_require__ (bootstrap:84)
    at Module../src/app/customers/customers-routing.module.ts (customers-customers-module.js:29)
    at __webpack_require__ (bootstrap:84)
    at Module../src/app/customers/customers.module.ts (customers.component.ts:9)
    at __webpack_require__ (bootstrap:84)
    at ZoneDelegate.invoke (zone-evergreen.js:364)
    at resolvePromise (zone-evergreen.js:798)
    at resolvePromise (zone-evergreen.js:750)
    at zone-evergreen.js:860
    at ZoneDelegate.invokeTask (zone-evergreen.js:399)
    at Object.onInvokeTask (core.js:41632)
    at ZoneDelegate.invokeTask (zone-evergreen.js:398)
    at Zone.runTask (zone-evergreen.js:167)
    at drainMicroTaskQueue (zone-evergreen.js:569)

Я знаю, что здесь есть циклическая зависимость, для быстро загружаемых модулей она работает и позволяет встряхивать дерево. Означает ли это, что в модулях с отложенной загрузкой в ​​NgModule можно использовать только массив поставщиков?

есть ли для этого рекомендации / лучшие практики?

Ответы [ 2 ]

0 голосов
/ 17 июня 2020

попробуйте вот так.

@Injectable({
  providedIn: 'root'
})

Сообщите мне, если вы все еще столкнетесь с какой-либо проблемой.

0 голосов
/ 17 июня 2020

Определенно существует круговая зависимость, которая выглядит так

CustomersComponent -> TestService -> CustomersModule -> CustomersComponent -> TestService

, поэтому вы получаете это исключение. CustomersModule and TestService вводят друг друга, поэтому вводят его в массив поставщика (вместо providedIn), будет делать то же самое, поэтому отмените ваши изменения и оставьте TestService в массиве провайдеров. Angular оптимизирует его так же, как и для providedIn атрибута

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...