Provide a service in Angular5 = "is not a function"

Thorsten Rintelen picture Thorsten Rintelen · Mar 29, 2018 · Viewed 8.7k times · Source

I want to override a service from an other module, but i got the error "is not a function"

In my component (module 1) i inject the servie

public constructor(private chartProgressService: ChartProgressService) {
}

In module 2 i override the servive in providers

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

and this is MyChartProgressService

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

@Injectable()
export class InnogyChartProgressService {

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

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

The call this.chartProgressService.getValue() in my component returns the error

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)

I think i need your help! Thanks!

Answer

Pranay Rana picture Pranay Rana · Mar 29, 2018

one more thing is if you want to use InnogyChartProgressService

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

@Injectable()
export class InnogyChartProgressService {
}

then it should be like

 {
    provide: ChartProgressService,
    useClass: InnogyChartProgressService 
},

in you case you are referring different class called MyChartProgressService and change useClass


As per angular guide if you want to replace service with new service than you need to extend service , for example given in angular guide

to do this , replace old Logger with new one

[{ provide: Logger, useClass: BetterLogger }]

it extends old one in new one as below

@Injectable()
export class EvenBetterLogger extends Logger {
}

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