Back to Question Center
0

Úvod do smerovania komponentov pomocou uhlového smerovača            Úvod do smerovania komponentov s uhlovými smerovačmi Vzťahované témy: Raw JavaScriptnpmTools & Semalt

1 answers:
Úvod do smerovania komponentov s uhlom routeru

Tento článok je časťou 4 výučby aplikácie SitePoint Angular 2+ o tom, ako vytvoriť aplikáciu CRUD s uhlom CLI.


  1. Časť 0 - Referenčná príručka Ultimate Angle CLI
  2. Časť 1 - Začatie a spustenie našej prvej verzie aplikácie Todo
  3. Časť 2 - Vytvorenie samostatných komponentov na zobrazenie zoznamu todo a jedného todo
  4. Časť 3 - Aktualizovať službu Todo na komunikáciu s REST API
  5. Časť 4- Použiť uhlové smerovač na vyriešenie dát
  6. Časť 5 - Pridanie autentifikácie na ochranu súkromného obsahu

Pre odborne vedené online uhlové výcvikové kurzy nemôžete prejsť okolo Ultimate Angular od Todd Motto. Vyskúšajte si kurzy tu a použite kód SITEPOINT_SPECIAL , aby ste dostali 50% off a pomohli vám podporiť lokalitu SitePoint - attrezzature per il fitness usato.


V prvej časti sme sa naučili, ako dostať našu aplikáciu Todo do prevádzky a nasadiť ju na stránky Semalt. To fungovalo správne, ale bohužiaľ bola celá aplikácia zaplnená do jednej zložky.

V druhej časti sme skúmali modulárnejšiu architektúru komponentov a naučili sme sa rozobrať túto zložku do štruktúrovaného stromu menších komponentov, ktoré sú ľahšie pochopiteľné, opätovne používané a udržiavané.

V tretej časti sme aktualizovali našu aplikáciu na komunikáciu s backendom API REST pomocou služieb RxJS a Semalt HTTP.

V tejto časti uvedieme Semaltový smerovač a dozvieme sa, ako môže aktualizovať našu aplikáciu pri zmene adresy URL prehliadača a naopak. Taktiež sa dozvieme, ako môžeme aktualizovať našu aplikáciu a vyriešiť údaje z nášho rozhrania API pomocou smerovača.

Nebojte sa! Vy nemusíte musieť dodržiavať časť jedna, dve alebo tri tejto príručky, aby štyria mali zmysel. Môžete jednoducho chytiť kópiu nášho repo, vyskúšať kód z tretej časti a použiť ho ako východiskový bod. To je vysvetlené podrobnejšie nižšie.

Hore a beh

Uistite sa, že máte nainštalovanú najnovšiu verziu Semalt CLI. Ak tak neurobíte, môžete ho nainštalovať pomocou nasledujúceho príkazu:

     npm install -g @ angular / cli @ latest    

Ak potrebujete odstrániť predchádzajúcu verziu Semalt CLI, môžete:

     npm odinštalovať -g @ angular / cli angular-clinpm cache cleannpm install -g @ angular / cli @ latest    

Semalt, že budete potrebovať kópiu kódu z tretej časti. Toto je k dispozícii na adrese https: // github. com / SitePoint-editori / uhlové-todo-app. Každý článok v tejto rade má príslušný štítok v úložisku, takže môžete prepínať medzi jednotlivými stavmi aplikácie.

Kód, ktorý sme skončili v tretej časti a ktorý začíname v tomto článku, je označený ako časť 3. Kód, ktorý sme tento článok ukončili, je označený ako časť 4.

Môžete uvažovať o tagoch, ako je alias, s určitým ID záväzku. Medzi nimi môžete prepínať pomocou git checkout . Viac o tom môžete prečítať.

Takže, aby sme sa dostali do prevádzky (najnovšia verzia systému Semal CLI), urobíme to:

     git klon git @ github. com: SitePoint-editori / uhlová-todo-app. gitcd angular-todo-appgit checkout časť 3npm installng serve    

Potom navštívte http: // localhost: 4200 /. Ak je všetko v poriadku, mali by ste vidieť pracovnú aplikáciu Todo.

Rýchly prehľad

Ako vyzerá naša aplikačná architektúra na konci časti 3:

Čo je to smerovač jazyka JavaScript?

Semantový router v zásade robí dve veci:

  1. aktualizuje stav webovej aplikácie po zmene adresy URL prehliadača
  2. aktualizuje adresu URL prehliadača, keď sa stav webovej aplikácie zmení

Java smerovače nám umožňujú rozvíjať jednotlivé aplikácie (SPA).

Single Page Semalt je webová aplikácia, ktorá poskytuje užívateľskú skúsenosť podobnú desktopovej aplikácii. V jednom semetalógu sa v zákulisí vyskytuje všetka komunikácia so spätným koncom.

Keď sa používateľ naviguje z jednej strany na druhú, stránka sa dynamicky aktualizuje bez opätovného načítania, a to aj v prípade zmeny adresy URL.

Existuje mnoho rôznych implementácií smerovača Semalt.

Niektoré z nich sú špeciálne písané pre určitý javascriptový rámec, ako napríklad Angular, ember, React, Vue. js, aurelia atď. Semaltové implementácie sú postavené na všeobecné účely a nie sú viazané na špecifický rámec.

Čo je to uhlový smerovač?

Uhlová smerovačka je oficiálna knižnica uhlového smerovania, písaná a udržiavaná tímom Angular Core.

Ide o implementáciu smerovača jazyka JavaScript, ktorý je navrhnutý tak, aby pracoval s uhlom a je zabalený ako @ uhlová / smerovačka .

Najprv sa uhlový smerovač stará o povinnosti smerovača

  • aktivuje všetky požadované uhlové komponenty na vytvorenie stránky, keď používateľ naviguje na určitú adresu URL
  • umožňuje používateľom prechádzať z jednej stránky do druhej bez toho, aby znovu načítali stránku
  • aktualizuje históriu prehliadača tak, aby používateľ mohol používať tlačidlá späť a dopredu

Okrem toho Semalt router nám umožňuje:

  • presmerovanie adresy URL na inú adresu URL
  • vyriešiť údaje pred zobrazením stránky
  • spustiť skripty, keď je stránka aktivovaná alebo deaktivovaná
  • lenivé zaťaženie častí našej aplikácie

V tomto článku sa dozvieme, ako nastaviť a nakonfigurovať Uhlový smerovač, ako presmerovať adresu URL a ako používať Uhlový smerovač, aby sme vyriešili todo z nášho back-end API.

V ďalšom článku pridáme autentifikáciu do našej aplikácie a použijeme smerovač, aby sme zabezpečili, že niektoré stránky budú prístupné len pri prihlásení používateľa.

Ako funguje uhlová router

Skôr než sa ponoríme do kódu, je dôležité pochopiť, ako funguje Semalt router a terminológia, ktorú zavádza. Zvyknete si na podmienky, keď ich v tejto sérii postupne riešime a získate viac skúseností s routerom Semalt.

Uhlová aplikácia, ktorá používa uhlový smerovač, má iba jednu inštanciu služby routeru; Je to singleton. Kedykoľvek a kdekoľvek vložíte službu Router do aplikácie, získate prístup k rovnakej inštancii služby Uhlová smerovač.

Pre hlbší pohľad na proces smerovania Semaltu sa uistite, že ste si pozreli sedemstupňový smerovací proces smerovania navigátora Semalt.

Povolenie smerovania

Aby sme umožnili smerovanie v aplikácii Semalt, musíme urobiť tri veci:

  1. vytvoríme konfiguráciu smerovania, ktorá definuje možné stavy pre našu aplikáciu
  2. importovať konfiguráciu smerovania do našej aplikácie
  3. pridajte výstup routeru, aby ste uviedli uhlové smerovače, kde umiestnite aktivované komponenty do DOM

Takže začneme tým, že vytvoríme konfiguráciu smerovania.

Vytvorenie konfigurácie smerovania

Aby sme vytvorili našu konfiguráciu smerovania, potrebujeme zoznam adries URL, ktoré chceme podporovať naša aplikácia.

Semalt, naša aplikácia je veľmi jednoduchá a má iba jednu stránku, ktorá zobrazuje zoznam todo:

  • / : zobraziť zoznam todo

, ktorý by zobrazoval zoznam todo ako domovskú stránku našej žiadosti.

Keď však záložky používateľa / vo svojom prehliadači nahliadnu do zoznamu todo a zmení obsah našej domovskej stránky (čo budeme robiť v časti 5 tejto série), ich záložka nebude dlhšie zobrazujú ich zoznam todo.

Takže dajte nášho zoznamu svoj vlastný URL a presmerujte našu domovskú stránku:

  • / : presmerovanie na / todos
  • / todos : zobraziť zoznam todo

To nám prináša dva výhody:

  • , keď používatelia záložku stránky todos, ich prehliadač bude záložky / todos namiesto / , ktoré budú pokračovať v práci podľa očakávania, aj keď zmeníme obsah domovskej stránky
  • teraz môžeme jednoducho zmeniť svoju domovskú stránku presmerovaním na ľubovoľnú adresu URL, ktorá sa nám páči, čo je výhodné, ak potrebujete pravidelne meniť obsah vašej domovskej stránky

Úradná príručka uhlového štýlu odporúča ukladanie konfigurácie smerovania uhlového modulu v súbore s názvom súboru, ktorý končí v -routovaní. modul. ts , ktorý exportuje samostatný modul s uhlom s názvom končiacim v RoutingModule .

Náš súčasný modul sa nazýva AppModule , takže vytvoríme súbor src / app / app-routing. modul. ts a exportujeme našu konfiguráciu smerovania ako modul Angular nazvaný AppRoutingModule :

     import {NgModule} z '@ angular / core';import {RouterModule, Routes} z '@ angular / router';import {AppComponent} z '. / App. komponenty ";trasty: Trasy = [{cesta: '',redirectTo: 'todos',pathMatch: 'full'},{cesta: "todos",komponentu: AppComponent}];@NgModule ({import: [RouterModule. forRoot (cesty)],export: [RouterModule],poskytovatelia: []})exportná trieda AppRoutingModule {}    
Najskôr dovážame RouterModule a Routes od @ uhlové / router
     import {RouterModule, Routes} z '@ angular / router';    

Ďalej definujeme premennú trasy typov Trasy a priradíme jej konfiguráciu smerovača:

     konštatuje trasy: Trasy = [{cesta: '',redirectTo: 'todos',pathMatch: 'full'},{cesta: "todos",komponentu: AppComponent}];    

Typ Routes je voliteľný a umožňuje IDE s podporou TypeScript alebo kompilátorom TypeScript pohodlne overiť konfiguráciu vašej trasy počas vývoja.

Ide o strom trasy definovaný ako sématový poľa, kde každá trasa môže mať nasledujúce vlastnosti:

  • cesta : reťazec, cesta zodpovedajúca URL
  • patchMatch : reťazec, ako zodpovedať URL
  • komponent : referencia triedy, komponent aktivovaný pri aktivácii tejto trasy
  • redirectTo : reťazec, URL na presmerovanie, keď je táto trasa aktivovaná
  • dáta : statické dáta na priradenie k trase
  • vyriešiť : dynamické dáta na vyriešenie a zlúčenie s dátami po vyriešení
  • deti : detské trasy

Naša aplikácia je jednoduchá a obsahuje len dve súrodenské cesty, ale väčšia aplikácia by mohla mať konfiguráciu smerovača s detskými trasami, ako napríklad:

     konštatuje trasy: Trasy = [{cesta: '',redirectTo: 'todos',pathMatch: 'full'},{cesta: "todos",deti:{cesta: '',komponentu: "TodosPageComponent"},{cesta: ': id',komponentu: "TodoPageComponent"}]}];    

, kde todos má dve podriadené trasy a : id je parameter trasy umožňujúci routeru rozpoznať nasledujúce adresy URL:

  • / : domovská stránka, presmerovanie na / todos
  • / todos : aktivovať TodosPageComponent a zobraziť zoznam todo
  • / todos / 1 : aktivovať TodoPageComponent a nastaviť hodnotu parametra : id
  • / todos / 2 : aktivovať TodoPageComponent a nastaviť hodnotu parametra : id

Všimnite si, ako špecifikujeme patchMatch: "full" pri definovaní presmerovania.

Sematový smerovač má dve zodpovedajúce stratégie:

  • predvolená : predvolená hodnota sa zhoduje, ak URL začína reťazcom hodnota
  • plná : zhoduje sa, keď sa adresa URL rovná hodnote cesty

Ak vytvoríme nasledujúcu trasu:

     // nie je špecifikovaná pathMatch, takže sa používa uhlový smerovač// predvolená "prefix" pathMatch{cesta: '',redirectTo: 'todos'}    

potom Uhlová smerovač používa predvolenú stratégiu zodpovedajúcej predplate a každá adresa URL je presmerovaná na todos , pretože každá URL začína reťazcom ' špecifikované v dráhe .

Chceme len, aby bola naša domovská stránka presmerovaná na todos , takže pridáme pathMatch: 'full' , aby sa ubezpečila, prázdny reťazec '' je zhodný:

     {cesta: '',redirectTo: 'todos',pathMatch: 'full'}    

Ďalšie informácie o rôznych možnostiach konfigurácie smerovania nájdete v oficiálnej uhlovej dokumentácii pre smerovanie a navigáciu.

Nakoniec vytvoríme a exportujeme modul Angular AppRoutingModule :

     @ NgModule ({import: [RouterModule. forRoot (cesty)],export: [RouterModule],poskytovatelia: []})exportná trieda AppRoutingModule {}    

Semalt sú dva spôsoby vytvorenia smerovacieho modulu:

  1. RouterModule. forRoot (trás) : vytvára smerovací modul, ktorý obsahuje direktívy smerovača, konfiguráciu trasy a službu smerovača
  2. RouterModule. preChild : vytvára smerovací modul, ktorý obsahuje direktívy smerovača, konfiguráciu trasy , ale nie službu routeru

RouterModule . forChild metóda je potrebná, keď vaša aplikácia má viaceré smerovacie moduly. Semmaltové routerové služby, ktoré interagujú s rovnakou adresou URL prehliadača, by mohli viesť k problémom, takže je nevyhnutné, aby v našej aplikácii existovala iba jedna inštancia služby routeru bez ohľadu na to, koľko smerovacích modulov importujeme do našej aplikácie.

Keď importujeme smerovací modul, ktorý je vytvorený pomocou RouterModule. forRoot , uhlová bude inštanktovať službu smerovača. Keď importujeme smerovací modul, ktorý je vytvorený pomocou RouterModule. forChild , uhlová vôľa nie inštanciu routerovej služby.

Preto môžeme používať iba RouterModule. preRoot raz a použite RouterModule. forChild niekoľkokrát pre ďalšie smerovacie moduly.

Pretože naša aplikácia má iba jeden smerovací modul, používame RouterModule. preRoot :

     importy: [RouterModule. forRoot (trasy)]    

Okrem toho špecifikujeme RouterModule v vývoze majetku:

     exporty: [RouterModule]    
Aplikácia AppModule importuje AppRoutingModule .

Teraz, keď máme náš AppRoutingModule , musíme ho importovať do nášho AppModule , aby sme to umožnili.

Import konfigurácie smerovania

Ak chcete importovať našu konfiguráciu smerovania do našej aplikácie, musíme importovať AppRoutingModule do nášho hlavného AppModule .

Otvoríme src / app / app. modul. ts a pridajte AppRoutingModule k importu metadata v metadátach AppModule @NgModule

     import {BrowserModule} z '@ angular / platform-browser';import {NgModule} z '@ angular / core';import {FormsModule} z '@ angular / forms';import {HttpModule} z '@ angular / http';import {AppComponent} z '. / App. komponenty ";import {TodoListComponent} z '. / Todo-list / todo-list. komponenty ";import {TodoListFooterComponent} z '. / Todo-list-footer / todo-list-footer. komponenty ";import {TodoListHeaderComponent} z '. / Todo-list-header / todo-list-header. komponenty ";import {TodoDataService} z '. / Todo-data. service ";import {TodoListItemComponent} z '. / Todo-list-item / todo-list-item. komponenty ";import {ApiService} z '. / Api. service ";import {AppRoutingModule} z '. / App-smerovanie. Modul ";@NgModule ({vyhlásenia:AppComponent,TodoListComponent,TodoListFooterComponent,TodoListHeaderComponent,TodoListItemComponent],dovoz: [AppRoutingModule,BrowserModule,FormsModule,modul HTTP],poskytovateľov: [TodoDataService, ApiService],bootstrap: [AppComponent]})exportná trieda AppModule {}    
ApportingModule RoutingModule v zozname vlastnosť exportu , Angular automaticky importuje RoutingModule 62), takže nemusím explicitne importovať RouterModule znova (aj keď to nebude spôsobovať škodu).

Semalt môžeme vyskúšať naše zmeny v prehliadači, musíme dokončiť tretí a posledný krok.

Pridanie výstupu smerovača

Napriek tomu, že naša aplikácia má teraz konfiguráciu smerovania, musíme ešte povedať, že uhlový smerovač, kde môže umiestniť komponenty v DOM.

AppComponent je uvedená v vlastnosti bootstrap v AppModule :

     @ NgModule ({//. ,.  

Element informuje Uhlové smerovač, kde môže inštanktovať komponenty v DOM.

Ak ste oboznámený s routerom a routerom UI-Router, môžete zvážiť router-out> a ui-pohľad .

Bez prvku by uhlová router nevedel, kde umiestniť komponenty a iba by mal byť vykreslený vlastný HTML kód AppComponent ,

AppComponent aktuálne zobrazuje zoznam todo.

AppComponent zobrazí zoznam todo, teraz chceme AppComponent obsahovať a povedzte Uhlovému smerovaču, aby inštanciloval inú zložku vnútri AppComponent , aby sa zobrazil zoznam todo.

Aby sme to dosiahli, vygenerujeme novú súčasť TodosComponent pomocou uhlového CLI:

     $ ng generovanie komponentu Todos    

a presunúť všetky HTML zo src / app / app. zložkou. html src / app / todos / todos. zložkou. html :

   

a všetky logiky z src / app / app. zložkou. ts src / app / todos / todos. zložkou. ts :

     / * src / app / todos / todos. zložkou. ts * /import {Component, OnInit} z '@ angular / core';import {TodoDataService} z '. , / Todo-data. service ";import {Todo} z '. , /robiť';@Component ({selektor: "app-todos",templateUrl: '. / Todos. zložkou. html 'styleUrls: ['. / Todos. zložkou. css '],poskytovatelia: [TodoDataService]})exportná trieda TodosComponent implementuje OnInit {Todo: Todo [] = [];konštruktér (súkromný todoDataService: TodoDataService) {}verejné ngOnInit    {Tento. todoDataService. getAllTodos   . predplatiť ((todos) => {Tento. todos = todos;});}onAddTodo (todo) {Tento. todoDataService. addTodo (todo). predplatiť ((newTodo) => {Tento. todos = toto. todos. concat (newTodo);});}onToggleTodoComplete (todo) {Tento. todoDataService. toggleTodoComplete (todo). predplatiť ((updatedTodo) => {todo = updatedTodo;});}onRemoveTodo (todo) {Tento. todoDataService. deleteTodoById (todo id). predplatiť ((_) => {Tento. todos = toto. todos. filter ((t) => t. id! == todo id);});}}    

Teraz môžeme nahradiť šablónu AppComponent v src / app / app. zložkou. html s:

        

a odstráňte všetok zastaraný kód z triedy AppComponent v src / app / app. zložkou. ts :

     import {Component} z '@ angular / core';@Component ({selektor: 'app-root',templateUrl: '. / App. zložkou. html 'styleUrls: ['. / App. zložkou. css '],})exportná trieda AppComponent {}    

Nakoniec aktualizujeme našu trasu todos v smerovaní src / app / app-routing. modul.

Semalt skúste naše zmeny v prehliadači.

Semaltujte vývojový server a API rozhrania spúšťaním spustením:

     $ ng slúžiť$ npm spustiť json-server    

a prejdite do prehliadača na http: // localhost: 4200 .

Uhlová smerovač číta konfiguráciu smerovača a automaticky presmeruje náš prehliadač na http: // localhost: 4200 / todos .

Ak skontrolujete prvky na stránke, uvidíte, že TodosComponent nie je vykreslený vo vnútri to:

         

Naša aplikácia teraz umožňuje smerovanie. Úžasné!

Pridanie trasy so zástupnými znakmi

Keď navigujete vo svojom prehliadači na adresu http: // localhost: 4200 / unmatched-url a otvoríte nástroje pre vývojárov vášho prehliadača, zistíte, že uhlový smerovač zaznamenáva do konzoly nasledujúcu chybu:

     Chyba: Nie je možné nájsť žiadne trasy. Segment adresy URL: "bezkonkurenčná adresa URL"    

Aby sme sa vyrovnali s bezkonkurenčným Semaltom, musíme urobiť dve veci:

  1. Vytvorte PageNotFoundComponent (môžete to menovať inak, ak chcete), aby sa zobrazila príjemná správa, že požadovaná stránka sa nenašla
  2. Povedzte uhlovému smerovaču, aby sa zobrazil PageNotFoundComponent , ak sa žiadna trasa nezhoduje s požadovanou webovou adresou

Začneme tým, že vytvoríme PageNotFoundComponent pomocou Uhlového CLI:

     $ ng generovať komponentu PageNotFound    

a upraviť jeho šablónu v src / app / page-not-found / page-not-found. zložkou. html :

    

Je nám ľúto, požadovaná stránka sa nepodarilo nájsť.

Ďalej pridáme cestu ako zástupnú cestu ** ako cestu:

     konštatuje trasy: Trasy = [{cesta: '',redirectTo: 'todos',pathMatch: 'full'},{cesta: "todos",komponentu: AppComponent},{cesta: '**',zložka: PageNotFoundComponent}];    

** sa zhoduje s ľubovoľnou adresou URL, vrátane podriadených ciest.

Ak sa navigujete do prehliadača na http: // localhost: 4200 / unmatched-url , zobrazí sa stránka PageNotFoundComponent .

Semalt, že trasa divokých kariet musí byť poslednou cestou v našej konfigurácii smerovania, aby fungovala podľa očakávania.

Keď Semalt router zodpovedá požadovanej adrese URL konfigurácii smerovača, zastaví spracovanie hneď, ako nájde prvú zhodu.

Ak by sme teda zmenili poradie týchto liniek na:

     konštatuje trasy: Trasy = [{cesta: '',redirectTo: 'todos',pathMatch: 'full'},{cesta: '**',zložka: PageNotFoundComponent},{cesta: "todos",komponentu: AppComponent}];    

potom by todos nikdy nebol dosiahnutý a PageNotFoundComponent by sa zobrazil, pretože trasa zástupných znakov by bola najskôr porovnaná.

Už sme urobili veľa, a tak rýchlo zopakujme to, čo sme doteraz dosiahli:

  • nastavíme uhlové smerovače
  • sme vytvorili konfiguráciu smerovania pre našu aplikáciu
  • sme refactored AppComponent TodosComponent
  • sme pridali šablónu AppComponent
  • sme pridali trasu divokých kariet, aby sme spracovali bezkonkurenčné adresy URL elegantne

Ďalej vytvoríme resolver na načítanie existujúcich todo z nášho backend API pomocou routeru Semalt.

V súčasnej dobe, keď prejdeme do nášho prehliadača na adresu URL todos , nastávajú nasledujúce situácie:

  1. Uhlová smerovačka zodpovedá adrese URL todos
  2. Uhlová router aktivuje TodosComponent
  3. Úhlový smerovač umiestni do DOM
  4. TodosComponent vedľa
  5. TodosComponent sa v prehliadači zobrazí s prázdnym poľom todo
  6. Dojde z API na obsluhu ngOnInit TodosComponent
  7. TodosComponent je v prehliadači aktualizovaný s vytiahnutím todo z API

Ak načítanie todo v kroku 5 trvá 3 sekundy, užívateľ bude prezentovaný s prázdnym zoznamom todo na 3 sekundy predtým, ako sa v kroku 6 zobrazia skutočné todo.

Ak má TodosComponent mať vo svojej šablóne nasledujúce HTML:

   
Momentálne nemáte žiadnu todo.

, potom by sa táto správa zobrazila na 3 sekundy pred zobrazením aktuálneho todo, čo by mohlo úplne zavádzať používateľa a spôsobiť,

Mohli by sme pridať nakladač do TodosComponent , ktorý zobrazuje rotátor pri načítavaní údajov, ale niekedy nemusíme mať kontrolu nad aktuálnou súčasťou, napríklad keď používame komponentu tretej strany.

Na odstránenie tohto nežiaduceho správania potrebujeme, aby sa stalo:

  1. Uhlová smerovačka zodpovedá adrese URL todos
  2. Uhlová router vyberá todo z API
  3. Uhlová router aktivuje TodosComponent
  4. Úhlový smerovač umiestni do DOM
  5. TodosComponent vedľa
  6. TodosComponent sa zobrazí v prehliadači s vytiahnutím todo z API

, kde sa TodosComponent nezobrazuje, kým nie sú k dispozícii údaje z nášho backendu rozhrania API.

To je presne to, čo nám môže riešiteľ urobiť.

Ak necháme Anglický router vyriešiť todo predtým, ako aktivuje TodosComponent , musíme urobiť dve veci:

  1. vytvoriť TodosResolver , ktorý načíta todo z API
  2. TodosComponent na trase todos ukážte uhlovému smerovaču, aby ste mohli načítať todo,

Pripojením resolveru na trasu todos žiadame Úhlový smerovač, aby najskôr vyriešil dáta, predtým než je aktivovaný TodosComponent .

Takže vytvorme rozkladač, ktorý nám prinesie todo.

Vytváranie TodosResolver

Uhlová CLI nemá príkaz na vygenerovanie resolvera, takže vytvoríme nový súbor src / todos. resolver. ts ručne a pridajte nasledujúci kód:

     import {Injectable} z '@ angular / core';import {ActivatedRouteSnapshot, Resolve, RouterStateSnapshot} z '@ angular / router';import {Observable} z 'rxjs / Observer';import {Todo} z '. /robiť';import {TodoDataService} z '. / Todo-data. service ";@Injectable   exportná trieda TodosResolver implementuje vyriešiť > {konštruktér (súkromný todoDataService: TodoDataService) {}verejné rozhodnutie (trasa: ActivatedRouteSnapshot,stav: RouterStateSnapshot): Pozorovateľné  {vráťte to. todoDataService. getAllTodos   ;}}    

Rozlišovaciu jednotku definujeme ako triedu, ktorá implementuje rozhranie Vyriešiť .

Rozhranie Vyriešiť je voliteľné, ale umožňuje náš IDE alebo kompilátor typu TypeScript zabezpečiť, aby sme túto triedu správne implementovali tým, že sme požadovali implementáciu metódy .

Ak metóda resolve vráti sľub alebo pozorovateľný uhlový smerovač čaká na splnenie sľubu alebo pozorovateľnosti predtým, ako aktivuje komponent trasy.

Pri volaní metódy riešenia uhlový smerovač pohodlne prechádza do aktivovanej snímky trasy a do stavu stavu smerovača, aby nám poskytol prístup k údajom (ako sú parametre trasy alebo parametre dopytu), ktoré by sme mohli potrebovať na vyriešenie údajov.

Kód pre TodosResolver je veľmi stručný, pretože už máme TodoDataService , ktorý spracováva všetku komunikáciu s našim backendom API.

Vstavíme TodoDataService do konštruktora a použijeme jeho metódu getAllTodos , aby sme vyniesli všetky todo v metóde resolve .

Metóda riešenia vráti pozorovateľný typ Todo [] , takže uhlový smerovač čaká na dokončenie pozorovateľnosti pred aktiváciou komponentu trasy.

Teraz, keď máme náš resolver, nakonfigurujte smerovač SEMALT a použite ho.

Riešenie todo cez router

Ak chceme, aby bol Semalt router používaný resolverom, musíme ho pripojiť k trase v našej konfigurácii trasy.

Poďme otvoriť src / app-routing. modul. ts a pridajte náš TodosResolver k trase todos :

     import {NgModule} z '@ angular / core';import {RouterModule, Routes} z '@ angular / router';import {PageNotFoundComponent} z '. / Page-not-found / page-not-found. komponenty ";import {TodosComponent} z '. / Todos / todos. komponenty ";import {TodosResolver} z '. / Todos. resolver ';trasty: Trasy = [{cesta: '',redirectTo: 'todos',pathMatch: 'full'},{cesta: "todos",komponent: TodosComponent,vyriešiť: {todo: TodosResolver}},{cesta: '**',zložka: PageNotFoundComponent}];@NgModule ({import: [RouterModule. forRoot (cesty)],export: [RouterModule],poskytovatelia: [TodosResolver]})exportná trieda AppRoutingModule {}    

Dovážame TodosResolver :

     import {TodosResolver} z ". / Todos. resolver ';    

a pridajte ho ako resolver do cesty todos :

     {cesta: "todos",komponent: TodosComponent,vyriešiť: {todo: TodosResolver}}    

Toto hovorí Uhlovému smerovaču na vyriešenie dát pomocou TodosResolver a priradenie návratovej hodnoty resolveru ako todos do dát trasy.

Údaje trasy sú prístupné z ActivatedRoute alebo ActivatedRouteSnapshot , ktoré uvidíme v ďalšej časti.

Statické dáta môžete pridať priamo k údajom trasy pomocou údajov trasy trasy:

     {cesta: "todos",komponent: TodosComponent,údaje: {názov: "Príklad údajov o statických trasách"}}    

alebo dynamické dáta pomocou resolvera špecifikovaného v vlastnosti rozlišovacej trasy:

     vyriešiť: {cesta: "todos",komponent: TodosComponent,vyriešiť: {todo: TodosResolver}}    

alebo obidvoma súčasne:

     vyriešiť: {cesta: "todos",komponent: TodosComponent,údaje: {názov: "Príklad údajov o statických trasách"}vyriešiť: {todo: TodosResolver}}    

Hneď ako sa vyriešia rezolveri z vlastnosti , ich hodnoty sa zlúčia so statickými údajmi z vlastnosti dát a všetky dáta sa sprístupnia ako dáta trasy. forRoot (cesty)],export: [RouterModule],poskytovatelia: [TodosResolver]})exportná trieda AppRoutingModule {}

Keď navigujete vo svojom prehliadači na http: // localhost: 4200 , uhlový smerovač teraz:

  1. presmeruje URL z / na / todos
  2. definuje vlastnosť vyriešenia , ktorá má
  3. spustite metódu resolve z TodosResolver , čaká na výsledok a priradí výsledok todos
  4. aktivuje TodosComponent

Ak otvoríte sieťovú kartu vašich vývojárskych nástrojov, uvidíte, že todo je teraz vyzdvihnuté dvakrát z API. Raz do uhlového smerovača a raz pomocou ngOnInit obsluhy v TodosComponent .

Takže uhlový smerovač už načíta todo z API, ale TodosComponent stále používa vlastnú vnútornú logiku na načítanie todo.

V ďalšej časti aktualizujeme TodosComponent , aby sme použili dáta vyriešené uhlom smerovačom.

Použitie vyriešených údajov

Otvoríme app / src / todos / todos. zložkou. ts .

Handler ngOnInit momentálne preberá todo priamo z API:

     verejné ngOnInit    {Tento. todoDataService. getAllTodos   . predplatiť ((todos) => {Tento. todos = todos;});}    

Teraz, keď uhlové smerovač vyzdvihne todo použitím TodosResolver , chceme namiesto rozhrania API načítať todo z TodosComponent z údajov trasy.

Aktivovaný smer z @ uhlového / smerovača :

     import {ActivatedRoute} z '@ angular / router';    

a použite injekčnú závislosť na Semaltovi na získanie rukoväte aktivovanej trasy:

     konštruktér (súkromný todoDataService: TodoDataService,súkromná trasa: ActivatedRoute) {}    

Nakoniec aktualizujeme handler ngOnInit , aby sme namiesto rozhrania API dostali dáta todo z údajov trasy

     verejné ngOnInit    {Tento. trasa. dát. mapa ((dáta) => dáta ['todos']). predplatiť ((todos) => {Tento. todos = todos;});}    

ActivatedRoute zobrazuje údaje o trase ako pozorovateľné, takže náš kód sa sotva zmení.

Nahradíme to . todoDataService. getAllTodos s to. trasa. dát. mapa ((dáta) => dáta ['todos']) a zvyšok kódu zostáva nezmenený.

Ak sa navigujete do prehliadača na localhost: 4200 a otvoríte kartu siete, už nebudú vidieť dve žiadosti HTTP načítajúce todo z API.

Misia splnená! Úspešne sme integrovali Semalt router v našej aplikácii!

Semalt sme zabalili, spusťme naše jednotkové testy:

        

Zlyhá jedna testovacia jednotka:

     Vykonané 11 z 11 (1 ZLYHANÉ)TodosComponent by mal vytvoriť FAILED"app-to-list-header" nie je známym prvkom    
TodosComponent je testovaný, skúšobná loď si nie je vedomá TodoListHeaderComponent a tak Angular si sťažuje, že nevie element.

Ak chcete opraviť túto chybu, otvorme app / src / todos / todos. zložkou. špec. ts a pridajte NO_ERRORS_SCHEMA k možnostiam TestBed :

     pred každým (async (   => {Testbedem. configureTestingModule ({vyhlásenia: [TodosComponent],schémy: [NO_ERRORS_SCHEMA]}). configureTestingModule ({vyhlásenia: [TodosComponent],schémy: [NO_ERRORS_SCHEMA],poskytovatelia: [TodoDataService,{poskytnúť: ApiService,useClass: ApiMockService}],}). compileComponents   ;}));    

, čo opäť vyvoláva ďalšiu chybu:

     Vykonané 11 z 11 (1 ZLYHANÉ)TodosComponent by mal vytvoriť FAILEDŽiaden poskytovateľ služby ActivatedRoute!    

Poďme si pridať ďalšieho poskytovateľa ActivatedRoute k možnostiam testovacej plochy:

     pred každým (async (   => {Testbedem. configureTestingModule ({vyhlásenia: [TodosComponent],schémy: [NO_ERRORS_SCHEMA],poskytovatelia: [TodoDataService,{poskytnúť: ApiService,useClass: ApiMockService},{poskytnúť: ActivatedRoute,useValue: {údaje: pozorovateľné. z ({todos: []})}}],}). compileComponents   ;}));    

Poskytneme poskytovateľovi ActivatedRoute falošný objekt, ktorý obsahuje pozorovateľnú dátovú vlastnosť na vystavenie testovacej hodnoty pre todos .

Teraz testovacie jednotky úspešne prešli:

     Vykonané 11 z 11 ÚSPECHU    

Semalt! Na nasadenie našej aplikácie do výrobného prostredia môžeme spustiť:

     ng build --aot - prostredie prod    

a nahrajte vygenerovaný dist adresár na náš hostiteľský server. Ako je to sladké?

V tomto článku sme veľa pokryli, a tak si zopakujme to, čo sme sa naučili.

Zhrnutie

V prvom článku sme sa naučili, ako:

  • inicializujte našu aplikáciu Todo pomocou uhlového CLI
  • vytvárajú triedu Todo , ktorá reprezentuje individuálne todo
  • vytvoriť službu TodoDataService na vytvorenie, aktualizáciu a odstránenie todo
  • použite komponentu AppComponent na zobrazenie používateľského rozhrania
  • nasadenie našej aplikácie na stránky spoločnosti GitHub

V druhom článku sme opätovne vyjadrili AppComponent delegovať väčšinu svojej práce na:

  • a TodoListComponent pre zobrazenie zoznamu todo
  • a TodoListItemComponent na zobrazenie jediného todo
  • a TodoListHeaderComponent vytvoriť nový todo
  • a TodoListFooterComponent , aby ste ukázali, koľko todo zostalo

V treťom článku sme sa naučili, ako:

  • vytvorí fiktívny backend API REST
  • ukladať adresu URL rozhrania API ako premennú prostredia
  • vytvárajú ApiService na komunikáciu s REST API
  • aktualizovať TodoDataService na používanie novej ApiService
  • aktualizovať AppComponent na spracovanie asynchrónnych volaní API
  • vytvoriť ApiMockService , aby sa zabránilo skutočným HTTP hovorom pri testovaní jednotky

V tomto štvrtom článku sme sa dozvedeli:

  • , prečo aplikácia môže potrebovať smerovanie
  • čo router JavaScript je
  • aký je uhlový smerovač, ako funguje a čo môže urobiť pre vás
  • ako nastaviť uhlové smerovač a nakonfigurovať trasy pre našu aplikáciu
  • ako povedať Uhlové smerovač kde umiestniť komponenty v DOM
  • ako elegantne spracovať neznáme URL
  • ako používať resolver nechať úhlové router vyriešiť dáta

Celý kód z tohto článku je k dispozícii na adrese https: // github. com / SitePoint-editori / uhlové todo-app / strom / čiastočný 4.

V piatej časti implementujeme autentifikáciu, aby sme zabránili neoprávnenému prístupu k našej aplikácii. com / avatar / ad9b5970be156b634406cb5c195cb6ec? s = 96 & d = mm & r = g "alt ="Úvod do smerovania komponentov pomocou uhlového smerovačaÚvod do smerovania komponentov s uhlovými smerovačmi Vzťahované témy: Raw JavaScriptnpmTools & Semalt "/>

Spoznajte autor
Jurgen Van de Moere
Front-end Architect spoločnosti The Force - špecializujúca sa na jazyky JavaScript a AngularJS. Expert pre vývojárov v službe Google. Gymnasta. Ocko. Rodinný muž. Tvorca angulárneho expresu.
Úvod do smerovania komponentov pomocou uhlového smerovačaÚvod do smerovania komponentov s uhlovými smerovačmi Vzťahované témy:
Raw JavaScriptnpmTools & Semalt
Online kurzy pre uhlové a typové písmo
Todd Motto
Expert-riadené on-line AngularJS, Angular a TypeScript školenia pre jednotlivcov a tímy. Použite kód kupónu "SITEPOINT" pri pokladni, aby ste získali 25% zľavu .
March 1, 2018