2016-03-17 10 views
20

Od Angular2 access global service without including it in every constructor ja porwałem kod i lekko zmodyfikowane go do:Angular2 żaden dostawca błędu serwisowego

@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") 
    } 

} 

jednak, gdy próbuję uruchomić ten kod pojawia się błąd w konsoli:

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

Stworzyłem Plunkr z kodem na https://plnkr.co/edit/We2k9PDsYMVQWguMhhGl

Czy ktoś wie, co powoduje ten błąd?

Odpowiedz

27

Należy również zdefiniować ApiService w atrybucie providers.

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

To dlatego, że wtryskiwacze są oparte na komponentach. Jeśli chcesz mieć więcej szczegółów na temat sposobu wstrzykiwania usługę w serwisie, można rzucić okiem na to pytanie: