मुझे डिफ़ॉल्ट विकल्पों को ओवरराइड करने का विचार पसंद है, यह एक अच्छा समाधान की तरह लगता है।
हालाँकि, यदि आप Http
कक्षा को बढ़ा रहे हैं । इसे ज़रूर पढ़ें!
यहां कुछ जवाब वास्तव में गलत तरीके से ओवरलोडिंग के तरीके दिखा रहे हैं request()
, जिससे मुश्किल से लेकर गलतियां और अजीब व्यवहार हो सकता है। मैं इस पर खुद लड़खड़ा गया हूं।
यह समाधान request()
एंगुलर में विधि के कार्यान्वयन पर आधारित है 4.2.x
, लेकिन भविष्य के अनुकूल होना चाहिए:
import {Observable} from 'rxjs/Observable';
import {Injectable} from '@angular/core';
import {
ConnectionBackend, Headers,
Http as NgHttp,
Request,
RequestOptions,
RequestOptionsArgs,
Response,
XHRBackend
} from '@angular/http';
import {AuthenticationStateService} from '../authentication/authentication-state.service';
@Injectable()
export class Http extends NgHttp {
constructor (
backend: ConnectionBackend,
defaultOptions: RequestOptions,
private authenticationStateService: AuthenticationStateService
) {
super(backend, defaultOptions);
}
request (url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
if ('string' === typeof url) {
url = this.rewriteUrl(url);
options = (options || new RequestOptions());
options.headers = this.updateHeaders(options.headers);
return super.request(url, options);
} else if (url instanceof Request) {
const request = url;
request.url = this.rewriteUrl(request.url);
request.headers = this.updateHeaders(request.headers);
return super.request(request);
} else {
throw new Error('First argument must be a url string or Request instance');
}
}
private rewriteUrl (url: string) {
return environment.backendBaseUrl + url;
}
private updateHeaders (headers?: Headers) {
headers = headers || new Headers();
// Authenticating the request.
if (this.authenticationStateService.isAuthenticated() && !headers.has('Authorization')) {
headers.append('Authorization', 'Bearer ' + this.authenticationStateService.getToken());
}
return headers;
}
}
ध्यान दें कि मैं import { Http as NgHttp } from '@angular/http';
नाम क्लैश को रोकने के लिए इस तरह से ओरिजनल क्लास इंपोर्ट कर रहा हूं ।
यहां संबोधित समस्या यह है कि request()
विधि में दो अलग-अलग कॉल हस्ताक्षर हैं। जब Request
URL के बजाय ऑब्जेक्ट पास किया जाता है string
, तो options
तर्क को Angular द्वारा अनदेखा कर दिया जाता है। तो दोनों मामलों को ठीक से संभाला जाना चाहिए।
और यहां इस बात का उदाहरण दिया गया है कि डीआई कंटेनर के साथ इस ओवरराइड क्लास को कैसे पंजीकृत किया जाए:
export const httpProvider = {
provide: NgHttp,
useFactory: httpFactory,
deps: [XHRBackend, RequestOptions, AuthenticationStateService]
};
export function httpFactory (
xhrBackend: XHRBackend,
requestOptions: RequestOptions,
authenticationStateService: AuthenticationStateService
): Http {
return new Http(
xhrBackend,
requestOptions,
authenticationStateService
);
}
इस तरह के दृष्टिकोण से आप इंजेक्शन लगा सकते हैं Http
सामान्य रूप से कक्षा , लेकिन आपके ओवरराइड किए गए वर्ग को इसके बजाय जादुई रूप से इंजेक्ट किया जाएगा। यह आपको आवेदन के अन्य भागों (कार्रवाई में बहुरूपता) को बदलने के बिना आसानी से अपने समाधान को एकीकृत करने की अनुमति देता है।
बस अपने मॉड्यूल मेटाडेटा httpProvider
की providers
संपत्ति में जोड़ें ।