2015-12-04 1 views
5

Donc, nous parlons de angular2 et je sais qu'il est toujours en alpha. J'ai créé un service de base que je vais utiliser dans un autre service. Ce dernier est ensuite utilisé dans un composant.Aucun fournisseur pour ... erreur lors de l'utilisation du service qui utilise un autre service personnalisé

service de base ressemble à ce

import {Injectable, Observable} from 'angular2/core'; 
import {Http} from 'angular2/http'; 
import {RequestOptionsArgs, Connection, ConnectionBackend} from 'angular2/http'; 
import {BaseRequestOptions, RequestOptions} from 'angular2/http'; 
import {RequestMethods} from 'angular2/http'; 
import {Response} from 'angular2/http'; 
import {Request} from 'angular2/http'; 
import {makeTypeError} from 'angular2/src/facade/exceptions'; 

@Injectable() 

export class MyOAuth extends Http { 
    constructor(backend: ConnectionBackend, defaultOptions: RequestOptions) { 
    super(backend, defaultOptions); 
    } 

    /** 
    * Performs any type of http request. First argument is required, and can either be a url or 
    * a {@link Request} instance. If the first argument is a url, an optional {@link RequestOptions} 
    * object can be provided as the 2nd argument. The options object will be merged with the values 
    * of {@link BaseRequestOptions} before performing the request. 
    */ 
    request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> { 
    var responseObservable: any; 
    if (isString(url)) { 
     responseObservable = httpRequest(
      this._backend, 
      new Request(mergeOptions(this._defaultOptions, options, RequestMethods.Get, url))); 
    } else if (url instanceof Request) { 
     responseObservable = httpRequest(this._backend, url); 
    } else { 
     throw makeTypeError('First argument must be a url string or Request instance.'); 
    } 
    return responseObservable; 
    } 
} 

L'autre service qui utilise celui ci-dessus ressemble à ceci (authenticate.js):

import {Injectable, Inject} from 'angular2/angular2'; 
import {MyOAuth} from './MyOAuth'; 


@Injectable() 

export class AuthenticationService { 

    constructor(@Inject(MyOAuth) http) { 
    this.http = http; 
    } 

    authenticate(username, password, community) { 
    console.log('authenticate'); 
    } 
} 

Puis, dans la classe des utilisations de ce service Je l'appelle comme ceci:

import {Page} from 'ionic/ionic'; 
import './login.scss'; 
import {AuthenticationService} from '../../services/authentication'; 

@Page({ 
    templateUrl: 'app/login/login.html', 
    providers: [AuthenticationService] //As of alpha 42 
}) 

L'erreur que je reçois dans le navigateur est

EXCEPTION: No provider for MyOAuth! (LoginPage -> AuthenticationService -> MyOAuth) 

Il ne semble pas juste pour moi que je dois importer MyOAuth et ...

+0

Je pense que ce [question] (https://github.com/angular/angular/issues/5155) peut être utile. –

Répondre

2

Lorsque vous avez besoin d'injecter des services personnalisés dans d'autres services, vous devez fournir les services dans un contexte plus large (composant, page, app)

vous pouvez faire:Pour moi, si les services peuvent être réutilisés à plusieurs endroits, je le définis toujours dans le contexte de l'application. Ex:

@Component({ 
    templateUrl: 'build/app.html', 
    providers: [[AuthenticationService], [MyOAuth]] 
}) 
class MyApp{ 
} 

Ces services ne seront donc installés qu'une seule fois. Si vous les fournissez, par exemple: Page1, Page2, ils seront insérés deux fois

0

Vous devez fournir votre service ainsi:

import {Page} from 'ionic/ionic'; 
import {provider} from '@angular/core'; 
import './login.scss'; 
import {AuthenticationService} from '../../services/authentication'; 

@Page({ 
    templateUrl: 'app/login/login.html', 
    providers: [AuthenticationService, provide(MyOAuth, {useClass: MyOAuth})] 
})