2017-11-08 3 views
0

나는 생성자에 Http를 주입 기본 ServiceBase 클래스가 있습니다각도/타이프 라이터는 기본 클래스에 서비스를 주입하지만 하위 클래스에서

@Injectable() 
export class WeatherService extends ServiceBase<Weather> { 
    constructor(http: Http) { 
     super(http); 
    } 

    getWeather(): Promise<Weather> { 
     return this.getData('api/weather'); 
    } 
} 
:이 다음 하위 클래스에 의해 확장

import { Headers, Http } from '@angular/http'; 
import 'rxjs/add/operator/toPromise'; 

export abstract class ServiceBase<T> { 
    constructor(private http: Http) { 
    } 

    protected getData(url: string): Promise<T> { 
     return this.http.get(url).toPromise() 
      .then(response => response.json() as T) 
      .catch(this.handleError); 
    } 

    private handleError(error: any): Promise<any> { 
     console.log('An error occurred', error); 
     return Promise.reject(error.message || error); 
    } 
} 

그러나 모든 하위 클래스에 Http을 삽입하고 부모 클래스에 매개 변수를 전달하지 않으려면 super(http);을 호출하는 것이 좋습니다. 자식 클래스는 모두 서비스를 사용하는 부모 클래스에서 메서드를 호출하므로 기본 클래스에 Http 만 삽입하면됩니다.

+0

당신이 찾고있는 [이 사람] (https://stackoverflow.com/q/37482460/5621827) – jitender

답변

0

예 ReflectiveInjector에서 가능합니다.

import { Headers, Http } from '@angular/http'; 
 
import 'rxjs/add/operator/toPromise'; 
 

 
export abstract class ServiceBase<T> { 
 

 
    protected http: Http; 
 
    
 
    constructor() { 
 
     const injector = ReflectiveInjector.resolveAndCreate([ 
 
     Http, 
 
     BrowserXhr, 
 
     {provide: RequestOptions, useClass: BaseRequestOptions}, 
 
     {provide: ResponseOptions, useClass: BaseResponseOptions}, 
 
     {provide: ConnectionBackend, useClass: XHRBackend}, 
 
     {provide: XSRFStrategy, useFactory:() => new CookieXSRFStrategy()}, 
 
    ]); 
 
    this.http = injector.get(Http); 
 
    } 
 

 
    protected getData(url: string): Promise<T> { 
 
     return this.http.get(url).toPromise() 
 
      .then(response => response.json() as T) 
 
      .catch(this.handleError); 
 
    } 
 

 
    private handleError(error: any): Promise<any> { 
 
     console.log('An error occurred', error); 
 
     return Promise.reject(error.message || error); 
 
    } 
 
}