Github рдкрд░ Angular рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЦреЛрдЬ рдХреИрд╕реЗ рдХрд░реЗрдВ

рдЫрд╡рд┐

рдпрд╣ рд▓реЗрдЦ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реИ:


рд▓реЗрдЦ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╣реИ:

  • рджрд┐рдЦрд╛рдПрдБ рдХрд┐ рдЖрдк рдЬрд▓реНрджреА рд╕реЗ рдХреЛрдгреАрдп рдкрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЖрд╡реЗрджрди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЗрд╕рдХрд╛ рдореБрдЦреНрдп рд╢реМрдХ рдирд╣реАрдВ рд╣реИ,
  • рдХреЛрдгреАрдп рдкрд░ рдЖрд╡реЗрджрди рдХреЗ рдлрд╛рдпрджреЗ рджрд┐рдЦрд╛рдПрдВред

рд▓реЗрдЦ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдирд╣реАрдВ рд╣реИ:

  • рдПрдХ рдФрд░ рд╣реЛрд▓реАрд╡рд░ рдХрд╛ рдЬрд▓рд╛рдирд╛ред

рдЬреЛ рдХреЛрдИ рднреА рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рдореИрдВ рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗ рдкреВрдЫрддрд╛ рд╣реВрдВред

рдЯреНрд░реЗрдирд┐рдВрдЧ


рдХреЛрдгреАрдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП , рдЖрдкрдХреЛ рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рдХреЛрдгреАрдп рд╕реАрдПрд▓рдЖрдИ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛

npm install -g @angular/cli 

рдПрдХ рдирдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВ
 ng new github-ui cd github-ui 

рддреБрд░рдВрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдШрдЯрдХреЛрдВ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ, рдФрд░ github рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗрд╡рд╛ рдмрдирд╛рдПрдБ

 ng generate component components/user ng generate component components/error ng generate service services/github 

рдФрд░ рдЙрдиреНрд╣реЗрдВ рдореБрдЦреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред

рд╣рдо HttpClient (http рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдФрд░ рд░рд┐рдПрдХреНрдЯрд┐рд╡рд╡реЙрд░реНрдо (рдлреЙрд░реНрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рднреА рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВред

app.module.ts

 import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { ReactiveFormsModule } from '@angular/forms'; import { HttpClient } from '@angular/common/http'; import { AppComponent } from './app.component'; import { UserComponent } from './components/user/user.component'; import { ErrorComponent } from './components/error/error.component'; import { GithubService } from './services/github.service'; @NgModule({ declarations: [AppComponent, UserComponent, ErrorComponent], imports: [BrowserModule, ReactiveFormsModule, HttpClient], providers: [GithubService], bootstrap: [AppComponent] }) export class AppModule {} 

рдбреЗрдЯрд╛ рдореЙрдбрд▓


рдХреНрдпреЛрдВрдХрд┐ рдПрдВрдЧреБрд▓рд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣рдореЗрдВ рдЯрд╛рдЗрдкрд┐рдВрдЧ рджреЗрддрд╛ рд╣реИ, рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╛рдпрджреЗ рд╣реИрдВ:

  • рдЖрд╡реЗрджрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕реНрд╡рдд: рдкреВрд░реНрдг,
  • рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдЯрд╛рдЗрдкрд┐рдВрдЧ,
  • рдЕрдиреНрдп рдбреЗрд╡рд▓рдкрд░реНрд╕ рдпрд╣ рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдХрд┐рд╕ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдореЙрдбрд▓ / user.model.ts
 export class User { login: string; id: number; node_id: string; avatar_url: string; gravatar_id: string; url: string; html_url: string; followers_url: string; following_url: string; gists_url: string; starred_url: string; subscriptions_url: string; organizations_url: string; repos_url: string; events_url: string; received_events_url: string; type: string; site_admin: boolean; name: string; company: string; blog: string; location: string; email: string; hireable: string; bio: string; public_repos: number; public_gists: number; followers: number; following: number; created_at: string; updated_at: string; } 


рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрд╡рд╛


рдпрд╣ рдХрд╛рд░реНрдп рдХреЛ рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ рдПрдВрдЧреБрд▓рд░ рдореЗрдВ рд╕рд░реНрд╡рд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рд╛рде рд░рдЦрдиреЗ рдХреА рдкреНрд░рдерд╛ рд╣реИред

рдкрд╣рд▓реЗ рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рд╕реЗрд╡рд╛ рдореЗрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВред

рд╕реЗрд╡рд╛рдПрдВ / github.service.ts

 import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { Observable } from 'rxjs'; import { User } from '../models/user.model'; @Injectable() export class GithubService { //      http constructor(private http: HttpClient) {} //     getUser(name: string): Observable<User> { const url = `https://api.github.com/users/${name}`; return this.http.get<User>(url); } } 

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЦреЛрдЬ


рдХреЛрдгреАрдп рдмреЙрдХреНрд╕ рд╕реЗ рдирд┐рд░реНрдорд┐рдд RxJs рд╣реИ ред рдЗрд╕рдХреА рдорджрдж рд╕реЗ рдФрд░ рд░реВрдкреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓, рд╣рдо рдирд┐рдпрдВрддреНрд░рдг рдореВрд▓реНрдп рдХреЛ рдмрджрд▓рдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред

app.component.html

 <div class="container" [class.ready]="!!user"> <input [formControl]="findControl" placeholder="GitHub username" /> <app-user *ngIf="user" [user]="user"></app-user> <app-error *ngIf="error"></app-error> </div> 

app.component.ts

 import { Component, OnInit } from '@angular/core'; import { FormControl } from '@angular/forms'; import { GithubService } from './services/github.service'; import { User } from './models/user.model'; import { filter, switchMap, debounceTime, catchError } from 'rxjs/operators'; import { EMPTY } from 'rxjs'; @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'] }) export class AppComponent implements OnInit { //     findControl = new FormControl(); //   error: boolean = false; //   user: User = null; //  githubService    constructor(private githubService: GithubService) {} //    ngOnInit() { this.findControl.valueChanges .pipe( //       filter(value => value.length > 2), //     debounceTime(1000), //    switchMap(value => this.githubService.getUser(value).pipe( //   catchError(err => { this.user = null; this.error = true; return EMPTY; }) ) ) ) //   .subscribe(user => { this.user = user; this.error = false; }); } } 

рдЕрдиреНрдп рдШрдЯрдХ


рд╢реЗрд╖ рдШрдЯрдХ "рдмреЗрд╡рдХреВрдл" рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред рддрд░реНрдХ рди рд░рдЦреЗрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдкреНрд░рд╛рдкреНрдд рдЖрдВрдХрдбрд╝реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдШрдЯрдХ
 <div class="github-card user-card"> <div class="header User"></div> <a class="avatar" [href]="'https://github.com/'+user.login"> <img [src]="user.avatar_url+'&s=80'" [alt]="user.name" /> </a> <div class="content"> <h1>{{user.name}}</h1> <ul class="status"> <li> <a [href]="'https://github.com/'+user.login+'?tab=repositories'"> <strong>{{user.public_repos}}</strong>Repos </a> </li> <li> <a [href]="'https://gist.github.com/'+user.login"> <strong>{{user.public_gists}}</strong>Gists </a> </li> <li> <a [href]="'https://github.com/'+user.login+'/followers'"> <strong>{{user.followers}}</strong>Followers </a> </li> </ul> </div> </div> 

 import { Component, Input, ChangeDetectionStrategy } from '@angular/core'; import { User } from '../../models/user.model'; @Component({ selector: 'app-user', templateUrl: './user.component.html', styleUrls: ['./user.component.css'], changeDetection: ChangeDetectionStrategy.OnPush }) export class UserComponent { @Input() user: User; } 


рддреНрд░реБрдЯрд┐ рдШрдЯрдХ
 <div class="error"> <h2>Oops!</h2> <b> User not found. </b> <p>Please try searching again.</p> </div> 

 import { Component, OnInit, ChangeDetectionStrategy } from '@angular/core'; @Component({ selector: 'app-error', templateUrl: './error.component.html', styleUrls: ['./error.component.css'], changeDetection: ChangeDetectionStrategy.OnPush }) export class ErrorComponent {} 


рдХреЛрдгреАрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рдпрдо


  • рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рдбрд╛рдЯрд╛ рдЕрдзрд┐рдЧреНрд░рд╣рдг рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛,
  • рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рддрд░реНрдХ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдирд╛,
  • рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рд╕реНрдХреЗрд▓реЗрдмрд▓ рд╕рдВрд░рдЪрдирд╛,
  • рд░реВрдкреЛрдВ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдореЙрдбреНрдпреВрд▓,
  • рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд RxJs,
  • рдордЬрдмреВрдд рдЯрд╛рдЗрдкрд┐рдВрдЧ, рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЬрд╛рдБрдЪред

рд╕реНрд░реЛрдд рдХреЛрдб


GitHub
рд▓рд╛рдЗрд╡ рдбреЗрдореЛ

рдирд┐рд╖реНрдХрд░реНрд╖


рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХрд┐рд╕реА рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ) рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ, рд░реВрдкрд░реЗрдЦрд╛ рдпрд╛ рд╢реБрджреНрдз рдЬреЗрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЙрди рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЬреНрдЮрд╛рди рд╣реИ рдЬреЛ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╡реЗ рдХрд┐рддрдиреЗ рдЙрдкрдпреБрдХреНрдд рд╣реИрдВ, рдЗрд╕рдХреА рд╕рдордЭ рд╣реИред

рд╕реАрдЦрдиреЗ рдФрд░ рд╕реНрд╡рдЪреНрдЫ рдХреЛрдб рдореЗрдВ рд╕рднреА рд╕рдлрд▓рддрд╛!

Source: https://habr.com/ru/post/hi419933/


All Articles