Reputation: 95
So, we're talking about angular2 and I know it's still in alpha. I created a base service that I'm going to use in another service. The latter one is then used in a component.
Base service looks like this
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;
}
}
The other service that uses the above one looks like this (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');
}
}
Then in the class the uses this service i call it like this:
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
})
The error I get in the browser is
EXCEPTION: No provider for MyOAuth! (LoginPage -> AuthenticationService -> MyOAuth)
It doesn't seem right to me that I have to import MyOAuth
as well...
Upvotes: 5
Views: 8375
Reputation: 717
When you need to inject custom services into other services, you need to provide the services in bigger context (component, page, app)
You can do:
import {Page} from 'ionic/ionic';
import './login.scss';
import {AuthenticationService} from '../../services/authentication';
@Page({
templateUrl: 'app/login/login.html',
providers: [[AuthenticationService], [MyOAuth]]
})
For me, if services can be reuse in multiple places, I always define it in app context. Ex:
@Component({
templateUrl: 'build/app.html',
providers: [[AuthenticationService], [MyOAuth]]
})
class MyApp{
}
So those services will be instatiated only once. If you provide them in, for ex: Page1, Page2, they will be instatiated twice
Upvotes: 3
Reputation: 768
You need to provide your service as well:
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})]
})
Upvotes: 0