在@NgModule提供程序中使用原始值时,Angular prod构建问题

时间:2018-04-20 20:11:06

标签: angular typescript angular-cli angular5

我有一个服务,它有两个简单Date类型的成员变量。例如:

export class SampleService {

  constructor(
    private _fromDate: Date,
    private _toDate: Date
  ) { }

}

由于Date是原始的,而不是Angular的已知类型。我在我的模块@NgModule装饰中为它提供了默认值。例如:

providers:[{provide:Date, useValue: new Date()}]

我的应用程序运行正常,包括单元测试以及使用ng build构建。但是,使用--prod标志时出现以下错误,我的生产失败:

Can't resolve all parameters for SampleService in src/SampleService.ts: (?,?)

这里有点混淆这种行为。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

开发人员收到Can't resolve all parameters错误的典型原因是,要么不将服务注册为提供者,要么使用Angular在浏览器中运行后无法使用的某种类型(特别是在执行之后) AOT汇编)。

为了解决第二个问题,Angular有一个creating special tokens to use的概念,而不是在依赖注入的东西中使用类型。如果遵循引用的Angular文档中的说明,则在这种情况下将执行以下操作。

创建并使用InjectionToken

import { Inject, Injectable, InjectionToken} from '@angular/core';

export const DATE_TOKEN = new InjectionToken<Date>('date');

@Injectable()
export class SampleService {
  constructor(
    private @Inject(DATE_TOKEN) _fromDate: Date,
    private @Inject(DATE_TOKEN) _toDate: Date
  ) {}
}

提供令牌和服务

import { NgModule } from '@angular/core';

import { SampleService, DATE_TOKEN } from './sample.service.ts';

@NgModule({
    ...
    providers: [
        ...
        { provide: DATE_TOKEN, useValue: new Date() },
        SampleService
    ]
})
export class SampleModule {
}