【问题标题】:Angular dependency with "providedIn" in lazy loading modules延迟加载模块中带有“providedIn”的角度依赖
【发布时间】:2020-06-17 07:54:02
【问题描述】:

我以 Angular 的“延迟加载功能模块”为例: live demo

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());
  }
}

但是当我从 CustomersModule 的提供者数组中删除 TestService 并在 TestService 中使用 providedIn 时:

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)

我知道这里有循环依赖,对于急切加载的模块,它可以工作,并且会启用 tree-shaking。 这是否意味着在延迟加载模块中,NgModule 中只能使用 providers 数组?

是否有这方面的指南/最佳实践?

【问题讨论】:

标签: angular angular-dependency-injection


【解决方案1】:

肯定有循环依赖,看起来像这样

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

这就是为什么您会收到此异常 CustomersModule and TestService 正在相互注入,因此将其注入提供程序数组(而不是提供的 In)中,将执行相同的操作,因此撤消您的更改并将 TestService 保留在提供程序数组中。 Angular 将以与 providedIn 属性相同的方式对其进行优化

【讨论】:

    【解决方案2】:

    像这样试试。

    @Injectable({
      providedIn: 'root'
    })
    

    如果您仍然遇到任何问题,请告诉我。

    【讨论】:

      【解决方案3】:

      请参阅this 问题。在这方面,providedIn 属性非常令人困惑。

      这是否意味着在延迟加载模块中只能在 NgModule 中使用 providers 数组?

      是的,所以很遗憾,对于延迟加载的模块,摇树是不可能的。

      【讨论】:

        猜你喜欢
        • 2018-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-07
        • 1970-01-01
        • 1970-01-01
        • 2023-04-11
        相关资源
        最近更新 更多