Angular 2
सेवाएँ और निर्भरता इंजेक्शन
खोज…
उदाहरण सेवा
सेवाओं / my.service.ts
import { Injectable } from '@angular/core'; @Injectable() export class MyService { data: any = [1, 2, 3]; getData() { return this.data; } }
बूटस्ट्रैप विधि में सेवा प्रदाता पंजीकरण विश्व स्तर पर सेवा उपलब्ध कराएगा।
main.ts
import { bootstrap } from '@angular/platform-browser-dynamic'; import { AppComponent } from 'app.component.ts'; import { MyService } from 'services/my.service'; bootstrap(AppComponent, [MyService]);
संस्करण में RC5 वैश्विक सेवा प्रदाता पंजीकरण मॉड्यूल फ़ाइल के अंदर किया जा सकता है। अपने पूरे आवेदन के लिए अपनी सेवा का एक भी उदाहरण प्राप्त करने के लिए, सेवा को आपके आवेदन के एनकोडॉड्यूल में प्रदाताओं की सूची में घोषित किया जाना चाहिए। app_module.ts
import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { routing, appRoutingProviders } from './app-routes/app.routes'; import { HttpModule} from '@angular/http'; import { AppComponent } from './app.component'; import { MyService } from 'services/my.service'; import { routing } from './app-resources/app-routes/app.routes'; @NgModule({ declarations: [ AppComponent ], imports: [ BrowserModule, routing, RouterModule, HttpModule ], providers: [ appRoutingProviders, MyService ], bootstrap: [AppComponent], }) export class AppModule {}
MyComponent
में उपयोग
घटकों / my.component.ts
एप्लिकेशन घटकों में एप्लिकेशन प्रदाताओं को पंजीकृत करने के लिए वैकल्पिक दृष्टिकोण। यदि हम घटक स्तर पर प्रदाताओं को जोड़ते हैं जब भी घटक प्रदान किया जाता है तो यह सेवा का एक नया उदाहरण बना देगा।
import { Component, OnInit } from '@angular/core'; import { MyService } from '../services/my.service'; @Component({ ... ... providers:[MyService] // }) export class MyComponent implements OnInit { data: any[]; // Creates private variable myService to use, of type MyService constructor(private myService: MyService) { } ngOnInit() { this.data = this.myService.getData(); } }
Promise.resolve के साथ उदाहरण
सेवाओं / my.service.ts
import { Injectable } from '@angular/core';
@Injectable()
export class MyService {
data: any = [1, 2, 3];
getData() {
return Promise.resolve(this.data);
}
}
getData()
अब कार्य करता है एक वादा कॉल को पसंद करता है जो एक वादा करता है, जो तुरंत हल हो जाता है। परिणामों को अंदर रखा जा सकता है। .then()
और त्रुटियों का भी पता लगाया जा सकता है। यह अतुल्यकालिक तरीकों के लिए अच्छा अभ्यास और सम्मेलन है।
घटकों / my.component.ts
import { Component, OnInit } from '@angular/core';
import { MyService } from '../services/my.service';
@Component({...})
export class MyComponent implements OnInit {
data: any[];
// Creates private variable myService to use, of type MyService
constructor(private myService: MyService) { }
ngOnInit() {
// Uses an "arrow" function to set data
this.myService.getData().then(data => this.data = data);
}
}
एक सेवा का परीक्षण
एक ऐसी सेवा दी गई है जो उपयोगकर्ता को लॉगिन कर सकती है:
import 'rxjs/add/operator/toPromise';
import { Http } from '@angular/http';
import { Injectable } from '@angular/core';
interface LoginCredentials {
password: string;
user: string;
}
@Injectable()
export class AuthService {
constructor(private http: Http) { }
async signIn({ user, password }: LoginCredentials) {
const response = await this.http.post('/login', {
password,
user,
}).toPromise();
return response.json();
}
}
इसे इस तरह से परखा जा सकता है:
import { ConnectionBackend, Http, HttpModule, Response, ResponseOptions } from '@angular/http';
import { TestBed, async, inject } from '@angular/core/testing';
import { AuthService } from './auth.service';
import { MockBackend } from '@angular/http/testing';
import { MockConnection } from '@angular/http/testing';
describe('AuthService', () => {
beforeEach(() => {
TestBed.configureTestingModule({
imports: [HttpModule],
providers: [
AuthService,
Http,
{ provide: ConnectionBackend, useClass: MockBackend },
]
});
});
it('should be created', inject([AuthService], (service: AuthService) => {
expect(service).toBeTruthy();
}));
// Alternative 1
it('should login user if right credentials are passed', async(
inject([AuthService], async (authService) => {
const backend: MockBackend = TestBed.get(ConnectionBackend);
const http: Http = TestBed.get(Http);
backend.connections.subscribe((c: MockConnection) => {
c.mockRespond(
new Response(
new ResponseOptions({
body: {
accessToken: 'abcdef',
},
}),
),
);
});
const result = await authService.signIn({ password: 'ok', user: 'bruno' });
expect(result).toEqual({
accessToken: 'abcdef',
});
}))
);
// Alternative 2
it('should login user if right credentials are passed', async () => {
const backend: MockBackend = TestBed.get(ConnectionBackend);
const http: Http = TestBed.get(Http);
backend.connections.subscribe((c: MockConnection) => {
c.mockRespond(
new Response(
new ResponseOptions({
body: {
accessToken: 'abcdef',
},
}),
),
);
});
const authService: AuthService = TestBed.get(AuthService);
const result = await authService.signIn({ password: 'ok', user: 'bruno' });
expect(result).toEqual({
accessToken: 'abcdef',
});
});
// Alternative 3
it('should login user if right credentials are passed', async (done) => {
const authService: AuthService = TestBed.get(AuthService);
const backend: MockBackend = TestBed.get(ConnectionBackend);
const http: Http = TestBed.get(Http);
backend.connections.subscribe((c: MockConnection) => {
c.mockRespond(
new Response(
new ResponseOptions({
body: {
accessToken: 'abcdef',
},
}),
),
);
});
try {
const result = await authService.signIn({ password: 'ok', user: 'bruno' });
expect(result).toEqual({
accessToken: 'abcdef',
});
done();
} catch (err) {
fail(err);
done();
}
});
});