20

From Angular2 access global service without including it in every constructor I have grabbed the code and slightly modified it into:

@Injectable()
export class ApiService {
  constructor(public http: Http) {}

  get(url: string) {
    return http.get(url);
  }

}

@Injectable()
export abstract class BaseService {
  constructor(protected serv: ApiService) {}  
}

@Injectable()
export class MediaService extends BaseService {

  // Why do we need this?
  constructor(s: ApiService) {
    super(s)
  }

  makeCall() {
    this.serv.get("http://www.example.com/get_data")
  }

}

However, when I try to run this code I get an error in the console:

NoProviderError {message: "No provider for ApiService! (App -> MediaService -> ApiService)", stack: "Error: DI Exception↵

I have created a Plunkr with the code at https://plnkr.co/edit/We2k9PDsYMVQWguMhhGl

Does anyone know what causes this error?

Community
  • 1
  • 1
Bas van Dijk
  • 9,933
  • 10
  • 55
  • 91

1 Answers1

29

You need to also define ApiService in the providers attribute.

@Component({
  selector: 'my-app',
  providers: [MediaService, ApiService], // <-----
  template: `
    <div>
      <h2>Hello {{name}}</h2>
    </div>
  `,
  directives: []
})
export class App {
  constructor(mediaService: MediaService) {
    this.name = 'Angular2'

    console.log('start');

    mediaService.makeCall();
  }
}

It's because injectors are relied on components. If you want to have more details about how to inject a service into a service, you could have a look at this question:

Community
  • 1
  • 1
Thierry Templier
  • 198,364
  • 44
  • 396
  • 360