2

我想覆盖来自其他模块的服务,但出现错误“不是函数”

在我的组件(模块 1)中,我注入了服务

public constructor(private chartProgressService: ChartProgressService) {
}

在模块 2 中,我覆盖了提供程序中的服务

providers: [
    {
        provide: Configuration,
        useClass: AppConfiguration,
    },
    {
        provide: ChartProgressService,
        useValue: MyChartProgressService
    },
    {
        provide: LOCALE_ID,
        useValue: 'de-DE',
    }
],

这是 MyChartProgressService

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

@Injectable()
export class InnogyChartProgressService {

    public getUnit(): string {
        return '';
    }

    public getValue(currentValue: number, maxValue: number): number {
        return currentValue;
    }
}

在我的组件中调用 this.chartProgressService.getValue() 返回错误

HeaderComponent.html:11 ERROR TypeError: this.chartProgressService.getUnit is not a function
at ChartProgressComponent.ngOnInit (chart-progress.component.ts:33)
at checkAndUpdateDirectiveInline (core.js:12369)
at checkAndUpdateNodeInline (core.js:13893)
at checkAndUpdateNode (core.js:13836)
at debugCheckAndUpdateNode (core.js:14729)
at debugCheckDirectivesFn (core.js:14670)
at Object.eval [as updateDirectives] (HeaderComponent.html:11)
at Object.debugUpdateDirectives [as updateDirectives] (core.js:14655)
at checkAndUpdateView (core.js:13802)
at callViewAction (core.js:14153)

我想我需要你的帮助!谢谢!

4

3 回答 3

1

还有一件事是如果你想使用InnogyChartProgressService

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

@Injectable()
export class InnogyChartProgressService {
}

那么它应该像

 {
    provide: ChartProgressService,
    useClass: InnogyChartProgressService 
},

在您的情况下,您指的是不同的类MyChartProgressService并更改 useClass


根据角度指南,如果您想用新服务替换服务而不是扩展服务,例如角度指南中给出

为此,请用新的 Logger 替换旧的 Logger

[{ provide: Logger, useClass: BetterLogger }]

它将旧的扩展为新的,如下所示

@Injectable()
export class EvenBetterLogger extends Logger {
}

阅读:https ://angular.io/guide/dependency-injection#alternative-class-providers

于 2018-03-29T06:09:53.700 回答
0

{提供:ChartProgressService, useClass:MyChartProgressService}

于 2018-03-29T06:04:38.297 回答
0

问题实际上如下:如果您useValue在提供程序定义中使用,则必须在此处使用实际实例new MyChartProgressService()或对象文字。但是,如果您只想提供一个“蓝图”并让它由 Angular 自动实例化,请使用useClass类型,因此在您的情况下useClass: MyChartProgressService

更多解释可以在这个问题中找到。

于 2018-03-29T06:09:45.347 回答