рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░, рдореЗрд░рд╛ рдирд╛рдо рд╕рд░реНрдЧреЗрдИ рд╣реИ рдФрд░ рдореИрдВ рдПрдХ рд╡реЗрдм рдбреЗрд╡рд▓рдкрд░ рд╣реВрдВред рдЙрдзрд╛рд░ рджрд┐рдП рдЧрдП рдкрд░рд┐рдЪрдп рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рджрд┐рдорд┐рддреНрд░реА рдХрд╛рд░реНрд▓реЛрд╡рд╕реНрдХреА рдХреЛ рдорд╛рдл рдХрд░ рджреЛ, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрдирдХрд╛ рдкреНрд░рдХрд╛рд╢рди рдерд╛ рдЬрд┐рд╕рдиреЗ рдореБрдЭреЗ рдпрд╣ рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ред
рдЖрдЬ рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдФрд░ рдбреЛрдореЗрди рдореЙрдбрд▓ рдореЗрдВ рдХреЛрдгреАрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдлреЙрд░реНрдо рдореЗрдВ рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИ
[ { "id": 1, "first_name": "James", "last_name": "Hetfield", "position": "Web developer" }, { "id": 2, "first_name": "Elvis", "last_name": "", "position": "Project manager" }, { "id": 3, "first_name": "Steve", "last_name": "Vai", "position": "QA engineer" } ]
рдФрд░ рдЖрдкрдХреЛ рдЗрд╕реЗ рдЪрд┐рддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

рдпрд╣ рдЖрд╕рд╛рди рд▓рдЧ рд░рд╣рд╛ рд╣реИ - рдЪрд▓реЛ рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рдмреЗрд╢рдХ, рдЗрд╕ рд╕реВрдЪреА рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ UserService
рд╕реЗрд╡рд╛ рд╣реЛрдЧреАред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрд╡рддрд╛рд░ рдХрд╛ рд▓рд┐рдВрдХ рддреБрд░рдВрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ id
рдЖрдзрд╛рд░ рдкрд░ рдмрдирддрд╛ рд╣реИред
// UserService import {Injectable} from '@angular/core'; import {HttpClient} from '@angular/common/http'; import {Observable} from 'rxjs'; import {UserServerResponse} from './user-server-response.interface'; @Injectable() export class UserService { constructor(private http: HttpClient) { } getUsers(): Observable<UserServerResponse[]> { return this.http.get<UserServerResponse[]>('/users'); } getUserAvatar(userId: number): string { return `/users/${userId}/avatar`; } }
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП UserListComponent
рдШрдЯрдХ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧрд╛ред
// UserListComponent import {Component} from '@angular/core'; import {UserService} from '../services/user.service'; @Component({ selector: 'app-user-list', template: ` <div *ngFor="let user of users | async"> <img [src]="userService.getUserAvatar(user.id)"> <p><b>{{user.first_name}} {{user.last_name}}</b>, {{user.position}}</p> </div> ` }) export class UserListComponent { users = this.userService.getUsers(); constructor(public userService: UserService) { } }
рдФрд░ рдпрд╣рд╛рдБ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдорд╕реНрдпрд╛ рдереА ред рд╕рд░реНрд╡рд░ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред last_name
рдлрд╝реАрд▓реНрдб рдЦрд╛рд▓реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рд╣рдо рдШрдЯрдХ рдХреЛ рдЗрд╕ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рд╕реЗ рдкрд╣рд▓реЗ рдЕрд╡рд╛рдВрдЫрд┐рдд рд╕реНрдерд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред рд╕рдорд╛рдзрд╛рди рд╡рд┐рдХрд▓реНрдк рдХреНрдпрд╛ рд╣реИрдВ?
рдЖрдк рдбрд┐рд╕реНрдкреНрд▓реЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рд╣реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
<p> <b>{{[user.first_name, user.last_name].filter(el => !!el).join(' ')}}</b>, {{user.position}} </p>
рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣, рд╣рдо рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдУрд╡рд░рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдЦрд░рд╛рдм рд░реВрдк рд╕реЗ рдкрдардиреАрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдЖрд╡реЗрджрди рдФрд░ рдмрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ ...
рдПрдХ рдкреНрд░рдХрд╛рд░ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рдХрд░ рдПрдХ рдШрдЯрдХ рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реЗ рдХреЛрдб рдЦреАрдВрдЪреЛ
getUserFullName(user: UserServerResponse): string { return [user.first_name, user.last_name].filter(el => !!el).join(' '); }
рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмреЗрд╣рддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдкреВрд░реНрдг рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдЖрд╡реЗрджрди рдХреЗ рдПрдХ рд╕реНрдерд╛рди рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╣рдореЗрдВ рдЗрд╕ рдХреЛрдб рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЖрдк рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдШрдЯрдХ рд╕реЗ рд╕реЗрд╡рд╛ рдореЗрдВ рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рд╣рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рдХреЛрдб рдбреБрдкреНрд▓реАрдХреЗрд╢рди рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдорд┐рд▓ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ред рдФрд░ рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдЗрдХрд╛рдИ ( UserService
) рдХреЛ рдЙрд╕ рдореЗрдВ рдкрд╛рд░рд┐рдд рдЫреЛрдЯреЗ User
рдЗрдХрд╛рдИ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрд╕рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХрд╛ рд╕реНрддрд░ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИред
рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╕рдорд╕реНрдпрд╛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЗрд╕ рддрдереНрдп рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ рдХрд┐ рд╣рдо рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХреЗрд╡рд▓ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд╡рд┐рд╖рдп рдХреНрд╖реЗрддреНрд░ рд╕реЗ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ - рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреАред рдФрд░ рдЕрдЧрд░ рд╣рдо рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ - рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рддрд░реАрдХреЗред
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд░реНрдЧ рдмрдирд╛рдХрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ
// User export class User { readonly id; readonly firstName; readonly lastName; readonly position; constructor(userData: UserServerResponse) { this.id = userData.id; this.firstName = userData.first_name; this.lastName = userData.last_name; this.position = userData.position; } fullName(): string { return [this.firstName, this.lastName].filter(el => !!el).join(' '); } avatar(): string { return `/users/${this.id}/avatar`; } }
рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдПрдХ рд╕рд░реНрд╡рд░ рд░рд┐рд╕реНрдкрд╛рдВрд╕ рдбреЗрдЬрд╝рд░рд╛рдЗрдЬрд╝рд░ рд╣реИред рдкреВрд░реНрдг рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рдХрд╛ рддрд░реНрдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ User
рд╡рд░реНрдЧ рдХреЗ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╡рд┐рдзрд┐ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдПрдХ рдЕрд╡рддрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХред рдЕрдм рд╣рдо UserService
рдХрд╛ рд░реАрдореЗрдХ UserService
рддрд╛рдХрд┐ рдпрд╣ рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк User
рд╡рд░реНрдЧ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд▓реМрдЯрд╛рдП
// UserService import {Injectable} from '@angular/core'; import {HttpClient} from '@angular/common/http'; import {map} from 'rxjs/operators'; import {UserServerResponse} from './user-server-response.interface'; import {User} from './user.model'; @Injectable() export class UserService { constructor(private http: HttpClient) { } getUsers(): Observable<User[]> { return this.http.get<UserServerResponse[]>('/users') .pipe(map(listOfUsers => listOfUsers.map(singleUser => new User(singleUser)))); } }
рдирддреАрдЬрддрди, рд╣рдорд╛рд░реЗ рдШрдЯрдХ рдХрд╛ рдХреЛрдб рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреНрд▓реАрдирд░ рдФрд░ рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд░ рдЪреАрдЬ рдЬрд┐рд╕реЗ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╡рд╣ рдореЙрдбрд▓ рдореЗрдВ рдХреВрдЯрдмрджреНрдз рд╣реИ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рд╣реИред
import {Component} from '@angular/core'; import {UserService} from '../services/user.service'; @Component({ selector: 'app-user-list', template: ` <div *ngFor="let user of users | async"> <img [src]="user.avatar()"> <p><b>{{user.fullName()}}</b>, {{user.position}}</p> </div> ` }) export class UserListComponent { users = this.userService.getUsers(); constructor(private userService: UserService) { } }
рдЖрдЗрдП рдЕрдм рд╣рдорд╛рд░реЗ рдореЙрдбрд▓ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ (рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдореБрдЭреЗ ActiveRecord
рдкреИрдЯрд░реНрди рдХреЗ рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп рдкрд╕рдВрдж рд╣реИ), рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЙрдбрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рди рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд▓реНрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдЪрд┐рддреНрд░ рдХреЛ рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЙрдбрд▓ рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛?
// User export class User { // ... constructor(userData: UserServerResponse, private http: HttpClient, private storage: StorageService, private auth: AuthService) { // ... } // ... updateAvatar(file: Blob) { const data = new FormData(); data.append('avatar', file); return this.http.put(`/users/${this.id}/avatar`, data); } }
рдпрд╣ рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди User
рдореЙрдбрд▓ рдЕрдм HttpClient
рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдо рддреМрд░ рдкрд░ рдмреЛрд▓ рд░рд╣рд╛ рд╣реИ, рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рдЕрдиреНрдп рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ - рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, AuthService
рдФрд░ AuthService
(рд╡реЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ)ред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реЗрд╡рд╛ рдпрд╛ рдШрдЯрдХ рдореЗрдВ User
рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЗрд╕ рдореЙрдбрд▓ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рд╕реЗ рдЬреБрдбрд╝реА рд╕рднреА рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдмрд╣реБрдд рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд▓рдЧ рд░рд╣рд╛ рд╣реИ ... рдЖрдк Injector
рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдмреЗрд╢рдХ, рдЗрд╕реЗ рднреА рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╣реЛрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реЛрдЧреА) рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдмрд╛рд╣рд░реА рдЗрдВрдЬреЗрдХреНрдЯрд░ рдЗрдХрд╛рдИ рднреА рдмрдирд╛рдПрдВ рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЙрд╕реА рддрд░рд╣ рд╕реЗ UserService
рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП User
рд╡рд░реНрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХрд╛ рдЕрдзрд┐рдХ рд╕рд╣реА рддрд░реАрдХрд╛ рджреЗрдЦрддрд╛ рд╣реВрдВред рд╡рд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред
// UserService import {Injectable} from '@angular/core'; import {HttpClient} from '@angular/common/http'; import {Observable} from 'rxjs'; import {map} from 'rxjs/operators'; import {UserServerResponse} from './user-server-response.interface'; import {User} from './user.model'; @Injectable() export class UserService { constructor(private http: HttpClient, private storage: StorageService, private auth: AuthService) { } createUser(userData: UserServerResponse) { return new User(userData, this.http, this.storage, this.auth); } getUsers(): Observable<User[]> { return this.http.get<UserServerResponse[]>('/users') .pipe(map(listOfUsers => listOfUsers.map(singleUser => this.createUser(singleUser)))); } }
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдордиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд┐рд░реНрдорд╛рдг рд╡рд┐рдзрд┐ рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗрд╡рд╛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛, рдЬреЛ рдЕрдм рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╣реИ, рдФрд░ UserService
рдХреЗ рдХрдВрдзреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ - рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ UserService
рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЕрдВрдд рдореЗрдВ, рдЖрдЗрдП рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдирд╛рдореЛрдВ рд╕реЗ рджреЛрд╣рд░рд╛рд╡ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ рдФрд░ рдЗрдВрдЬреЗрдХреНрд╢рди рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдореНрдореЗрд▓рдиреЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░реЗрдВред рдореЗрд░реА рджреГрд╖реНрдЯрд┐ рдореЗрдВ рд╕реЗрд╡рд╛ рдХрд╛ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред
import {Injectable} from '@angular/core'; import {HttpClient} from '@angular/common/http'; import {Observable} from 'rxjs'; import {map} from 'rxjs/operators'; import {UserServerResponse} from './user-server-response.interface'; import {User} from './user.model'; @Injectable() export class UserFactory { constructor(private http: HttpClient, private storage: StorageService, private auth: AuthService) { } create(userData: UserServerResponse) { return new User(userData, this.http, this.storage, this.auth); } list(): Observable<User[]> { return this.http.get<UserServerResponse[]>('/users') .pipe(map(listOfUsers => listOfUsers.map(singleUser => this.create(singleUser)))); } }
рдФрд░ User
рдирд╛рдо рдХреЗ рддрд╣рдд UserFactory
рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ
import { Component } from '@angular/core'; import {HttpClient} from '@angular/common/http'; import {UserFactory} from './services/user.service'; @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'] }) export class AppComponent { title = 'app'; users = this.User.list(); constructor(private User: UserFactory) { } }
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, UserFactory
рд╡рд░реНрдЧ рдХреА рдПрдХ рд╡рд╕реНрддреБ User
рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░ рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ User
рд╡рд░реНрдЧ рдХреА рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ рдФрд░ рдирдИ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдзрд┐ рд╣реИ, рдФрд░ рдЗрд╕рдХреА рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЗрдХрд╛рдИ рд╕реЗ рдЬреБрдбрд╝реЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
рдЗрд╕ рдкрд░, рдореИрдВрдиреЗ рд╡рд╣ рд╕рдм рдХреБрдЫ рдмрддрд╛рдпрд╛ рдЬреЛ рдореИрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдореИрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рд╣реВрдВред
рдЕрджреНрдпрддрди
рдореИрдВ рдЙрди рд╕рднреА рдХрд╛ рдЖрднрд╛рд░ рд╡реНрдпрдХреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдЯрд┐рдкреНрдкрдгреА рдХрд░рддреЗ рд╣реИрдВред рдЖрдкрдиреЗ рд╕рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдирд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ Pipe
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реЛрдЧрд╛ред рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдФрд░ рдЦреБрдж рд╣реИрд░рд╛рди рд╣реВрдВ рдХрд┐ рдореИрдВ рдпрд╣ рдлреИрд╕рд▓рд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд▓рд╛рдпрд╛ред рдлрд┐рд░ рднреА, рд▓реЗрдЦ рдХрд╛ рдореБрдЦреНрдп рд▓рдХреНрд╖реНрдп рдПрдХ рдбреЛрдореЗрди рдореЙрдбрд▓ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, User
) рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдирд╛ рд╣реИ, рдЬреЛ рдЕрдкрдиреЗ рд╕рд╛рд░ рд╕реЗ рдЬреБрдбрд╝реЗ рд╕рднреА рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдВрд▓рдЧреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ, рдореИрдВрдиреЗ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред