Back to Question Center
0

Johdatus komponenttireititykseen reitittimellä            Johdatus komponenttireititykseen kulmaväylälläRelated Topics: Raw JavaScriptnpmTools & Semalt

1 answers:
Johdatus komponenttireititykseen kulmaväylällä

Tämä artikkeli on osa 4 SitePoint Angular 2+ oppaasta CRUD-sovelluksen luomisesta Angular CLI: n kanssa.


  1. Osa 0- Ultimate Angular CLI Reference Guide
  2. Osa 1 - Todo-sovelluksen ensimmäisen version hankkiminen käynnissä
  3. Osa 2 - erillisten komponenttien luominen näyttää listan todoista ja yhdestä todo
  4. Osa 3 Päivitä Todo-palvelu kommunikoimaan REST API: n kanssa
  5. Osa 4 - Käytä kulmataajuusmuuttajaa tiedon korjaamiseen
  6. Osa 5 - Yksityisen sisällön suojauksen lisääminen

Asiantuntijoiden johdolla suoritetuissa online-kurssikursseissa et voi mennä Todd Motton Ultimate Angularin ohi. Kokeile kursseja täällä ja käytä koodia SITEPOINT_SPECIAL saadaksesi 50% pois ja tukemaan SitePointia.


Ensimmäisessä osassa opimme, miten saisimme Todo-sovelluksemme käyttöön ja käyttämme sitä ja lähetämme sen Semalt-sivuille. Tämä toiminut hienosti, mutta valitettavasti koko sovellus pakattiin yhdeksi komponentiksi.

Toisessa osassa tutkittiin modulaarisempaa komponenttiarkkitehtuuria ja opimme, miten tämä yksittäinen komponentti hajotetaan jäsenneltyyn puuhun pienemmistä komponenteista, jotka ovat helpommin ymmärrettävissä, uudelleenkäytettävissä ja ylläpidettävissä - differenza ludoteca asilo nido.

Kolmannessa osassa päivitimme sovelluksemme kommunikoimaan REST API -hakemiston kanssa käyttäen RxJS- ja Semalt HTTP -palvelua.

Tässä osassa esitämme Semaltin reitittimen ja opimme, miten se voi päivittää sovelluksemme, kun selaimen URL-osoite muuttuu ja päinvastoin. Opimme myös, miten voimme päivittää sovelluksemme ratkaisemaan tietoja backend-sovellusliittymästä reitittimen avulla.

Älä huoli! Et ole tarvitse seurata osaa yksi, kaksi tai kolme tästä opetusohjelmasta, sillä neljä on järkevää. Voit yksinkertaisesti napata kopion reposumme, tarkistaa koodin kolmannesta osasta ja käyttää sitä lähtökohtana. Tätä selostetaan tarkemmin jäljempänä.

Ylös ja Juoksu

Varmista, että asennat uusimman version Semalt CLI -ohjelmistosta. Jos et, voit asentaa sen seuraavalla komennolla:

     npm asenna -g @ angular / cli @ viimeisin    

Jos haluat poistaa vanhan version Semalt CLI: sta, voit:

     npm uninstall -g @ kulma / cli angular-clinpm välimuisti puhdasnpm asenna -g @ angular / cli @ viimeisin    

Epäilen, että tarvitset kopion koodista kolmannesta osasta. Tämä on saatavilla osoitteessa https: // github. com / SitePoint-editorit / kulmikas-todo-sovellusta. Jokaisella tämän sarjan artikkelilla on vastaava tunniste arkistosta, joten voit vaihtaa edestakaisin sovelluksen eri tilojen välillä.

Koodi, jonka lopetimme kolmannessa osassa ja jonka alussa tässä artikkelissa on merkitty osa-3: ksi. Koodi, jonka lopetamme tämän artikkelin kanssa, on merkitty osa-4: ksi.

Voit ajatella tunnisteita, kuten aliaksia, tietyntyyppisen tunnuksen. Voit vaihtaa niiden välillä git-kassalla . Voit lukea lisää täältä.

Joten, jotta pääset alkuun ja ajaminen (uusin versio Semalt CLI asennettuna) tekisimme:

     git clone git @ github. com: SitePoint-editorit / kulmikas-todo-sovellusta. gitcd angular-todo-appgit checkout osa-3npm asentaang palvelevat    

Käy osoitteessa http: // localhost: 4200 /. Jos kaikki on hyvin, sinun pitäisi nähdä työskentelevä Todo-sovellus.

Lyhyt katsaus

Tässä kuvataan sovellusarkkitehtuurinamme osassa 3:

Mikä on JavaScript reititin?

Semalt reitittimellä on kaksi asiaa:

  1. päivittää web-sovellustilan, kun selaimen URL-osoite muuttuu
  2. päivittää selaimen URL-osoite, kun web-sovellustila muuttuu

JavaScript-reitittimet antavat meille mahdollisuuden kehittää yksittäisiä sovelluksia (SPA).

Single Page Semalt on web-sovellus, joka tarjoaa käyttäjälle samanlaisen käyttökokemuksen kuin työpöytäsovellus. Yhden sivun semalta, kaikki viestintä back-end tapahtuu kulissien takana.

Kun käyttäjä siirtyy sivusta toiseen, sivu päivitetään dynaamisesti ilman uudelleenlatausta, vaikka URL-osoite muuttuisi.

Saatavilla on monia erilaisia ​​Semalt-reitittimen toteutuksia.

Osa niistä on kirjoitettu tiettyihin JavaScript-puitteisiin, kuten Angular, Man, React, Vue. js, aurelia jne. Semaltin toteutukset on rakennettu geneerisiin tarkoituksiin eikä niitä ole sidottu tiettyyn kehykseen.

Mikä on kulma-reititin?

Kulma-reititin on virallinen Angular-reitityskirjasto, joka on kirjoitettu ja ylläpidetty Angular Core -tiimissä.

Se on JavaScript-reitittimen toteutus, joka on suunniteltu toimimaan kulmikas ja se on pakattu @ kulma / reititin .

Ensinnäkin Cornular Router huolehtii Semalt -reitittimen tehtävistä:

  • aktivoi kaikki tarvittavat kulmakomponentit muodostamaan sivun, kun käyttäjä siirtyy tiettyyn URL-osoitteeseen
  • avulla käyttäjät voivat siirtyä sivulta toiseen ilman sivun lataamista
  • se päivittää selaimen historian, jotta käyttäjä voi käyttää taaksepäin ja eteenpäin

Lisäksi Semalt-reitittimen avulla voimme:

  • URL-osoitteen uudelleenohjaus toiseen URL-osoitteeseen
  • ratkaisee tiedot ennen sivun näyttämistä
  • ajaa komentosarjoja, kun sivu aktivoidaan tai deaktivoidaan
  • laihdut kuormaosat hakemuksestani

Tässä artikkelissa opimme määrittelemään ja konfiguroimaan Kulmataajuus reititin, kuinka ohjata URL-osoitetta ja miten kulmataajuusreitittimen avulla ratkaista todo-ohjelmat selainrajapinnasta.

Seuraavassa artikkelissa lisätään todennus hakemuksestasi ja käytetään reitittimen avulla varmistamalla, että joitain sivuja voi käyttää vain, kun käyttäjä on kirjautunut sisään.

Miten kulma-reititin toimii

Ennen kuin sukellämme koodin, on tärkeää ymmärtää, miten Semalt-reititin toimii ja sen käyttöönottamia termejä. Olet tottunut termeihin, kun käsittelemme niitä vähitellen tässä sarjassa ja kun saat enemmän kokemusta Semalt-reitittimestä.

Kulma-reitittimellä varustettu kulma-sovellus on vain yksi reitittimen palvelusuoritus; Se on singleton. Aina ja aina, kun pistät Router -palvelun sovelluksessasi, pääset käsiksi samaan Kulmataajuuspalvelun esiintymään.

Semalt-reititysprosessin perusteellisempaa tarkastelua varten varmista, että tarkista Semalt-reitittimen navigoinnin 7-vaiheinen reititysprosessi.

Reititysmahdollisuus

Semalt-sovelluksen reitittämiseksi on tehtävä kolme asiaa:

  1. luo reitityskokoonpano, joka määrittää sovelluksemme mahdolliset tilat
  2. tuoda reitityskonfiguraation sovel- luksi
  3. lisää reitittimen ulostulo osoittaaksesi Kulma reitittimen, johon sijoitetaan aktivoidut komponentit DOM

Aloitetaan siis luomalla reititysasetukset.

Reitityskokoonpanon luominen

Jotta voimme luoda reititysasetuksemme, tarvitsemme luettelon URL-osoitteista, joita haluamme sovelluksestamme tukea.

Semalt, hakemuksemme on hyvin yksinkertainen ja siinä on vain yksi sivu, joka näyttää listan todoista:

  • / : näyttää listan todoista

, joka näyttäisi luettelon todoista hakemuksemme kotisivulta.

Kuitenkin, kun käyttäjän selaimessa / selaimessa kysytään heidän todo-listansa ja muutetaan kotisivun sisältöä (mitä teemme tämän sarjan osassa 5), ​​niiden kirjanmerkki ei näyttävät kauemmin listan todoista.

Joten anna meidän todo-listalle oma URL-osoite ja ohjata kotisivuamme siihen:

  • / : uudelleenohjaus / todos
  • / todos : näyttää listan todoista

Tämä antaa meille kaksi etua:

    / todos sijaan / sijasta, kun taas käyttäjät vaihtavat kotisivun sisältöä
  • voimme nyt helposti vaihtaa kotisivumme ohjaamalla sen haluamaasi URL-osoitteeseen, mikä on kätevää, jos haluat vaihtaa etusivun sisältöä säännöllisesti

Virallinen kulma-tyyppinen opas suosittelee reitityskokoonpanon tallentamista kulma-moduuliin tiedostossa, jonka tiedostonimi päättyy -käsittelyssä. moduuli. ts , joka vie erillisen kulma-moduulin ja jonka nimi päättyy RoutingModule .

Nykyinen moduuli on nimeltään AppModule , joten luodaan tiedosto src / app / app-reititys. moduuli. ts ja viedä reitityskokoonpanon kulmamoduuliksi AppRoutingModule :

   tuoda {NgModule} kohteesta "@ angular / core";tuoda {RouterModule, Reitit} osoitteesta '@ angular / router';tuoda {AppComponent} kohteesta '. /sovellus. komponentti ";const reitit: Reitit = [{polku: ''uudelleenohjausTo: 'todos',pathMatch: "täysi"},{polku: 'todos',komponentti: AppComponent}];@NgModule ({tuonti: [RouterModule. forRoot (reitit)],vienti: [RouterModule],tarjoajat: []})vientiluokka AppRoutingModule {}    

Ensin tuodaan reititinmoduulin ja reitit @ kulma / reitittimestä :

   tuonti {RouterModule, Reitit} "@ kulma- / reitittimestä";    

Seuraavaksi määritellään tyypin Reitit muuttujan reitit ja osoitamme sen reitittimen konfiguraatiolle:

   const reitit: Reitit = [{polku: ''uudelleenohjausTo: 'todos',pathMatch: "täysi"},{polku: 'todos',komponentti: AppComponent}];    

Reitit -tyyppi on valinnainen ja antaa IDE: n, jolla on TypeScript-tuki tai TypeScript-kääntäjä,.

Se on reittipuu, joka on määritelty Semalt-taulukoksi, jossa kullakin reitillä voi olla seuraavat ominaisuudet:

  • polku : merkkijono, polku vastaamaan URL-osoitetta
  • patchMatch : merkkijono, miten sovittaa URL
  • komponentti : luokan viite, komponentti aktivoidaan, kun tämä reitti aktivoituu
  • redirectTo : merkkijono, URL, jota ohjataan reitittimen aktivoimiseksi
  • tiedot : staattiset tiedot osoitettaviksi reitille
  • ratkaista : dynaaminen data ratkaista ja yhdistää dataa , kun se ratkaistaan ​​
  • lapset : lasten reitit

Hakemuksemme on yksinkertainen ja siinä on vain kaksi sisarusreittiä, mutta suuremmalla sovelluksella voi olla reitittimen kokoonpano lasten reiteillä, kuten:

   const reitit: Reitit = [{polku: ''uudelleenohjausTo: 'todos',pathMatch: "täysi"},{polku: 'todos',lapset: [{polku: ''komponentti: 'TodosPageComponent'},{polku: ': id',komponentti: 'TodoPageComponent'}]}];    
: id on reittiparametri, jonka avulla reititin voi tunnistaa seuraavat URL: t:

  • / : kotisivu, uudelleenohjaus / todos
  • / todos : aktivoi TodosPageComponent ja näyttää listan todo: n
  • / todos / 1 : Aktivoi TodoPageComponent ja asetetaan arvo : id parametriksi
  • / todos / 2 : aktivoi TodoPageComponent ja asetetaan arvo : id parametriksi 2

Huomaa, miten määritämme patchMatch: "täynnä" määritettäessä uudelleenohjausta.

Semalt reitittimellä on kaksi vastaavaa strategiaa:

  • etuliite : oletusarvo vastaa, kun URL alkaa arvolla
  • täydellinen : vastaa, kun URL on reitin arvo

Jos luomme seuraavan reitin:

   // ei polkua määritetty, joten kulmaohjainta käytetään// oletusarvoinen `prefix` pathMatch{polku: ''uudelleenohjausTo: 'todos'}    
, kun jokainen URL alkaa tyhjä merkkijonon " ' , joka on määritelty kohdassa .

Haluamme vain, että kotisivusi ohjataan osoitteeseen todos , joten lisäämme pathMatch: "täysi" varmistaaksemme, että vain URL, joka tyhjä merkkijono '' sovitetaan yhteen:

   {polku: ''uudelleenohjausTo: 'todos',pathMatch: "täysi"}    

Lisätietoja eri reitityksen määritysvaihtoehdoista saat tarkistamalla reititys- ja navigointipalvelujen viralliset kulmakirjat.

Lopuksi luodaan ja vietään kulmamoduuli AppRoutingModule :

   @NgModule ({tuonti: [RouterModule. forRoot (reitit)],vienti: [RouterModule],tarjoajat: []})vientiluokka AppRoutingModule {}    

Reititysmoduulin luominen kahdella tavalla:

  1. RouterModule. forRoot (reitit) : luo reititysmoduulin, joka sisältää reitittimen ohjeet, reittikokoonpanon ja reitittimen palvelun
  2. RouterModule. forChild (reitit) : luo reititysmoduulin, joka sisältää reitittimen ohjeet, reitin kokoonpanon mutta ei reitittimen palvelua

RouterModule . forChild -menetelmää tarvitaan, kun sovelluksessasi on useita reititysmoduuleja. Moninkertaiset reitittimen palvelut, jotka toimivat samassa selaimen URL-osoitteessa, johtaisivat ongelmiin, joten on tärkeää, että reitityspalvelusta löytyy vain yksi hakemus, riippumatta siitä, kuinka monta reititysmoduulia tuodaan hakemuksessamme.

Kun tuodaan reititysmoduulin, joka on luotu käyttäen RouterModulea. forRoot , Angular instantiates reitittimen palvelu. Kun tuodaan reititysmoduulin, joka on luotu käyttäen RouterModulea. forChild , kulma ei aiheuta reitittimen palvelua.

Siksi voimme käyttää vain RouterModulea. forRoot kerran ja käytä RouterModule. forChild useita kertoja lisäreititysmoduuleille.

Koska hakemuksessamme on vain yksi reititysmoduuli, käytämme RouterModulea. forRoot :

   tuonti: [RouterModule. forRoot (reitit)]    

Lisäksi määritellään RouterModule -viennissä :

   vienti: [RouterModule]    
AppModule tuodaan AppRoutingModule , kun AppModule
tuodaan AppModule .

Nyt kun meillä on AppRoutingModule , meidän on tuoda se meidän AppModule , jotta se olisi mahdollista.

Reitityskokoonpanon tuominen

Tuoda reititysmallimme sovelluksessamme meidän on tuoda AppRoutingModule tärkeimpiin AppModule -ohjelmaan.

Avaa src / app / app. moduuli. AppModule : n @NgModule metadata AppRoutingModule ja tuonti

   tuoda {BrowserModule} osoitteesta '@ angular / platform-browser';tuoda {NgModule} osoitteesta '@ angular / core';tuoda {FormsModule} osoitteesta '@ angular / forms';tuoda {HttpModule} osoitteesta '@ angular / http';tuoda {AppComponent} kohteesta '. /sovellus. komponentti ";tuonti {TodoListComponent} kohteesta '. / Todo-lista / todo-lista. komponentti ";tuoda {TodoListFooterComponent} kohteesta '. / Todo-lista-footer / todo-lista-footer. komponentti ";tuoda {TodoListHeaderComponent} kohteesta '. / Todo-lista-header / todo-lista-otsikko. komponentti ";tuoda {TodoDataService} osoitteesta '. / Todo-data. palvelu ";tuo {TodoListItemComponent} kohteesta '. / Todo-lista-item / todo-lista-erä. komponentti ";tuoda {ApiService} käyttäjältä. / Api. palvelu ";tuoda {AppRoutingModule} osoitteesta '. / App-reititys. moduuli';@NgModule ({ilmoitukset: [AppComponent,TodoListComponent,TodoListFooterComponent,TodoListHeaderComponent,TodoListItemComponent],tuonti: [AppRoutingModule,BrowserModule,FormsModule,HttpModule],palveluntarjoajat: [TodoDataService, ApiService],bootstrap: [AppComponent]})vientiluokka AppModule {}    
AppRoutingModule on RoutingModule listattu sen viennin ominaisuudessa, Angular tuo RoutingModule automaattisesti tuodessasi AppRoutingModule 62), joten meidän ei tarvitse nimenomaisesti tuoda uudelleen RouterModulea uudelleen (vaikka näin ei olisi mitään haittaa).

Emme voi kokeilla muutoksia selaimessa, meidän on täytettävä kolmas ja viimeinen vaihe.

Reitittimen ulostulon lisääminen

Vaikka hakemuksessamme on nyt reititysasetus, meidän on vielä kerrottava kulmikäytävä, jossa se voi sijoittaa instantioituneet komponentit DOM: iin.

AppModule : n bootstrap -ominaisuuden ominaisuus:

, kun sovellus on bootstrapped,
   @NgModule ({//. . 

< -elementti kertoo kulmataajuusreitittimen, jossa se voi tuoda esiin osia DOM: ssa.

kulma-vaihtoehdon ng-näkymään , jos olet tuttu AngularJS 1. x reititin ja UI- ja ui-näkymä .

elementti Kulma-reititin ei tiedä, mihin paikka komponentit olisi ja vain AppComponentin .

AppComponent näyttää tällä hetkellä luettelon todoista.

ja kerro Cornular reiteri instantiating toisen komponentin sisälle AppComponent näyttää listan todo's.

Tämän saavuttamiseksi luodaan uusi komponentti TodosComponent käyttäen kulmakulmaista CLI: tä

     $ ng muodostaa komponentin Todos    

ja siirrä kaikki HTML src / app / app. komponentti. html - src / app / todos / todos. komponentti. html :

   

ja kaikki logiikka src / app / app. komponentti. ts - src / app / todos / todos. komponentti. ts :

   / * src / app / todos / todos. komponentti. ts * /tuoda {Component, OnInit} osoitteesta '@ angular / core';tuoda {TodoDataService} osoitteesta '. / Todo-data. palvelu ";maahantuoja {Todo}. /tehdä';@Component ({valitsin: 'app-todos',templateUrl: '. / Tehtävät. komponentti. html',styleUrls: ['. / Tehtävät. komponentti. css'],tarjoajat: [TodoDataService]})vientiluokka TodosComponent toteuttaa OnInit {todos: Todo [] = [];rakentaja(yksityinen todoDataService: TodoDataService) {}julkinen ngOnInit    {Tämä. todoDataService. getAllTodos   . tilaa ((todos) => {Tämä. todos = todos;});}onAddTodo (todo) {Tämä. todoDataService. addTodo (todo). tilaa ((uusiTodo) => {Tämä. todos = tämä. todos. concat (newTodo);});}onToggleTodoComplete (todo) {Tämä. todoDataService. toggleTodoComplete (todo). tilaa ((päivitettyTodo) => {todo = päivitettyTodo;});}onRemoveTodo (todo) {Tämä. todoDataService. deleteTodoById (todo. id). tilaa ((_) => {Tämä. todos = tämä. todos. suodatin ((t) => t. id! == todo. id);});}}    

Nyt voimme korvata AppComponentin mallin osoitteessa src / app / app. komponentti. html :

        

ja poista kaikki vanhentuneet koodit AppComponent : n luokasta src / app / app. komponentti. ts :

   tuonti {Komponentti} kohteesta "@ kulma / ydin";@Component ({valitsin: 'app-root',templateUrl: '. /sovellus. komponentti. html',styleUrls: ['. /sovellus. komponentti. css'],})vientiluokka AppComponent {}    

Lopuksi päivitämme todos reitin src / app / app-reitityksessä. moduuli.

Semalt kokeile muutoksia selaimessa.

Kehitystoiminnon ja backend-sovellusliittymän epäonnistuminen suorittamalla:

     $ ng palvelevat$ npm suorita json-server    

ja selaa selaimeesi osoitteeseen http: // localhost: 4200 .

Kulmaohjain lukee reitittimen asetukset ja ohjaa selaimesi automaattisesti osoitteeseen http: // localhost: 4200 / todos .

, mutta aivan vieressä se:

         

Sovelluksemme on nyt reititys käytössä. Mahtava!

Luonnonvarren reitin lisääminen

Kun navigoit selaimesi kohtaan http: // localhost: 4200 / unmatched-url ja avaat selaimen kehittäjätyökalut, huomaat, että Kulma-reititin kirjaa seuraavan virheen konsoliin:

   Virhe: Ei voi vastata mitään reittejä. URL-segmentti: 'vertaansa vailla oleva URL-osoite'    

Jotta käsittelemättömän Semaltin kohteliaisuus olisi välttämätöntä, meidän on tehtävä kaksi asiaa:

  1. Luo PageNotFoundComponent (voit nimetä sen toisin, jos haluat) näyttääksesi ystävällisen viestin, että pyydettyä sivua ei löytynyt
  2. Kerro Cornular reititin näyttämään PageNotFoundComponent , kun mitään reittiä ei vastaa pyydettyä URL-osoitetta

Aloita luomalla PageNotFoundComponent käyttämällä kulma-CLI:

     $ ng generoi komponentin PageNotFound    

ja muokkaa sen mallia src / app / page-not-found / page-not-found. komponentti. html :

    

Valitettavasti pyydettyä sivua ei löytynyt.

Seuraavaksi lisätään jokerimerkki reitillä ** polulla:

   const reitit: Reitit = [{polku: ''uudelleenohjausTo: 'todos',pathMatch: "täysi"},{polku: 'todos',komponentti: AppComponent},{polku: '**',komponentti: PageNotFoundComponent}];    

** vastaa mitä tahansa URL-osoitetta, mukaan lukien lapsipolut.

Jos selaimesi navigoidaan osoitteeseen , http: // localhost: 4200 / unmatched-url , PageNotFoundComponent tulee näkyviin.

Epäilen, että välikappaleen reitin on oltava viimeinen reitti reititysmuodossa, jotta se toimisi odotetusti.

Kun Semalt-reititin vastaa pyynnön URL-osoite reitittimen kokoonpanoon, se lopettaa käsittelyn heti, kun se löytää ensimmäisen ottelun.

Jotta muutettaisiin reittien järjestystä:

   const reitit: Reitit = [{polku: ''uudelleenohjausTo: 'todos',pathMatch: "täysi"},{polku: '**',komponentti: PageNotFoundComponent},{polku: 'todos',komponentti: AppComponent}];    

ja sitten todos ei koskaan saavutettu ja PageNotFoundComponent näytettäisiin, koska jokerimerkki reitistä vastaisi ensin.

Olemme jo tehneet paljon, joten kerrotaan nopeasti, mitä tähän mennessä olemme tehneet:

  • olemme asettaneet Kulmaohjaimen
  • loimme reitityskonfiguraatiomme hakemuksessamme
  • ja TodosComponent
  • lisäsimme - AppComponentin mallin
  • lisäsimme jokerimerkin reitin käsittelemään vertaansa vailla olevia URL-osoitteita armollisesti

Seuraavaksi luodaan resolveri, jolla löydetään olemassa olevat todo-ohjelmat backend-sovellusliittymältä käyttämällä Semalt -reitittimen avulla.

Tällä hetkellä selaimessamme todos URL-osoitteessa tapahtuu:

  1. Kulma reititin vastaa todos URL
  2. Kulmaohjain aktivoi TodosComponentin
  3. Kulma-reititin sijoittaa TodosComponentin DOM-
  4. TodosComponent näkyy selaimessa tyhjällä joukolla todoja
  5. Toidot noudetaan API ngOnInit -ohjaimesta TodosComponent
  6. TodosComponent päivitetään selaimessa, kun todo on noudettu API: sta

Jos lataat todoa vaiheessa 5 kestää 3 sekuntia, käyttäjälle esitetään tyhjää todo-luetteloa 3 sekuntia ennen kuin todelliset todo-osoitteet näytetään vaiheessa 6.

Jos TodosComponentilla oli mallipohjassaan seuraava HTML-koodi:

   
Tällä hetkellä sinulla ei ole vielä todoja.

käyttäjä näkee tämän viestin 3 sekuntia ennen kuin todelliset todo-ohjelmat näytetään, mikä voi täysin johtaa harhaan käyttäjää ja aiheuttaa käyttäjän siirtymään pois ennen kuin tiedot tulevat.

Voimme lisätä kuormaajaan TodosComponent -ohjelmaan , jossa on spinner, kun tietoja ladataan, mutta joskus emme voi hallita varsinaista komponenttia, esimerkiksi kun käytämme kolmannen osapuolen komponenttia.

Tämän ei-toivotun käyttäytymisen korjaamiseksi tarvitsemme seuraavaa:

  1. Kulma reititin vastaa todos URL
  2. Kulma reititin hakee toidet API: lta
  3. Kulmaohjain aktivoi TodosComponentin
  4. Kulma-reititin sijoittaa TodosComponentin DOM-
  5. TodosComponent näkyy selaimessa, jossa todo on noudettu sovellusliittymästä

, jossa TodosComponent ei näy, ennen kuin API-tausta-aineistomme on käytettävissä.

Tämä on juuri se, mitä ratkaisija voi tehdä meille.

Jotta Corner-reititin ratkaisi toidet ennen kuin aktivoi TodosComponentin , meidän on tehtävä kaksi asiaa:

  1. luo TodosResolver , joka hakee toidet API: lta
  2. todos reitti aktivoimaan TodosComponentin reitillä

Liittämällä resolverin reitille todos pyydämme Animaatioreitintä ratkaisemaan tiedot ensin, ennen kuin TodosComponent on aktivoitu.

Joten luodaan ratkaisija, joka hakee meidän todo: n.

TodosResolverin luominen

Kulma CLI: llä ei ole komentoa resoluutiota varten, joten luodaan uusi tiedosto src / todos. resolverin. ts manuaalisesti ja lisää seuraava koodi:

   tuonti {Injektoitava} kohteesta "@ kulma / ydin";tuonti {ActivatedRouteSnapshot, Resolve, RouterStateSnapshot} osoitteesta @ angular / router;tuonti {Observable} kohteesta "rxjs / Observable";maahantuoja {Todo}. /tehdä';tuoda {TodoDataService} osoitteesta '. / Todo-data. palvelu ";@Injectable   vientiluokka TodosResolver toteuttaa Resolve > {rakentaja(yksityinen todoDataService: TodoDataService) {}julkinen ratkaisu (reitti: ActivatedRouteSnapshot,tilaa: RouterStateSnapshot): Havainnoiva  {palauta tämä. todoDataService. getAllTodos   ;}}    

Määritämme resolverin luokaksi, joka toteuttaa Resolve -rajapinnan.

Resolve -rajapinta on valinnainen, mutta sen avulla TypeScript IDE tai kääntäjä varmistavat, että toteutamme luokan oikein vaatimalla meitä toteuttamaan resolve .

Jos resolve -menetelmä palauttaa lupauksen tai havaittavissa oleva kulmataajuusreitti odottaa lupausta tai havaittavissa olevan loppuun ennen kuin se aktivoi reitin osan.

Kun kutsutaan resolve -menetelmällä, kulma-reititin kulkee kätevästi aktivoitujen reittien tilannekuvan ja reitittimen tilan tilannekuvan avulla, jotta voimme käyttää tietoja (kuten reittiparametreja tai kyselyparametreja), joita me tarvitsemme tietojen ratkaisemiseksi.

TodosResolverin koodi on erittäin tiivis, koska meillä on jo TodoDataService , joka käsittelee kaikki kommunikointi API-taustaohjelmamme kanssa.

Inject TodoDataService konstruktorissa ja käytä getAllTodos -menetelmää kaikkien toidien etsimiseksi resolve -menetelmään.

Ratkaisumenetelmä palaa havaittavaksi tyypistä Todo [] , joten kulma-reititin odottaa havaittavissa olevan loppuun ennen reitin komponentin aktivointia.

Nyt, kun meillä on resoluutiimme, määritämme Semalt -reitittimen sen käyttämiseksi.

Ratkaisun todo-reitittimen kautta

Jotta Semalt -reititin käyttää resolveria, meidän on liitettävä se reittisuunnitelmaan reitille.

Avaa src / app-reititys. moduuli. ts ja lisää TodosResolver reittiin todos :

   tuoda {NgModule} kohteesta "@ angular / core";tuoda {RouterModule, Reitit} osoitteesta '@ angular / router';tuoda {PageNotFoundComponent} kohteesta '. / Sivu-ei-löytynyt / sivu-ei-löytynyt. komponentti ";tuoda {TodosComponent} kohteesta '. / Tehtävät / Tehtävät. komponentti ";tuoda {TodosResolver} mistä ". / Tehtävät. resolverin ";const reitit: Reitit = [{polku: ''uudelleenohjausTo: 'todos',pathMatch: "täysi"},{polku: 'todos',komponentti: TodosComponent,ratkaista: {todos: TodosResolver}},{polku: '**',komponentti: PageNotFoundComponent}];@NgModule ({tuonti: [RouterModule. forRoot (reitit)],vienti: [RouterModule],tarjoajat: [TodosResolver]})vientiluokka AppRoutingModule {}    

Tuomme TodosResolver :

   tuonti {TodosResolver} mistä ". / Tehtävät. resolverin ";    

ja lisää se resoluutioksi todos reitti:

   {polku: 'todos',komponentti: TodosComponent,ratkaista: {todos: TodosResolver}}    

Tämä kertoo Kulma-reitittimen ratkaista tiedot käyttäen TodosResolveria ja määrittää resolverin paluuarvoa todos reitin tietoihin.

Reitin tiedot ovat käytettävissä ActivatedRoute tai ActivatedRouteSnapshot , jota näemme seuraavassa osiossa.

Voit lisätä staattisia tietoja suoraan reitin tietoihin reitin data -ominaisuuden avulla:

   {polku: 'todos',komponentti: TodosComponent,tiedot: {otsikko: "Esimerkki staattisesta reittitiedosta"}}    

tai dynaamiset tiedot reitityksen resoluutiolla määritetyn resolverin avulla:

   ratkaisee: {polku: 'todos',komponentti: TodosComponent,ratkaista: {todos: TodosResolver}}    

tai molemmat samanaikaisesti:

   ratkaisee: {polku: 'todos',komponentti: TodosComponent,tiedot: {otsikko: "Esimerkki staattisesta reittitiedosta"}ratkaista: {todos: TodosResolver}}    

Kun resoluutiot resolve -ominaisuudesta päätetään, niiden arvot sulautuvat data -ominaisuuden staattiseen dataan ja kaikki tieto on saatavana reitin tiedoina. forRoot (reitit)],vienti: [RouterModule],tarjoajat: [TodosResolver]})vientiluokka AppRoutingModule {}

Kun navigoit selaimeesi osoitteeseen http: // localhost: 4200 , Kulma reititin nyt:

  1. ohjaa URL-osoitteen / - / todos
  2. todos reitti todosResolver määritellään sen ratkaistu omaisuudella TodosResolver odottaa tulosta ja antaa tuloksen todos reitin tietoihin
  3. aktivoi TodosComponent

Jos avaat kehittäjätyökalujen verkko-välilehden, näet, että toidot on nyt haettu kahdesti API: sta. Kerran kulmikäytävällä ja kerran ngOnInit -käsittelijällä TodosComponent .

Joten Kulma reititin hakee toidet jo API: sta, mutta TodosComponent käyttää edelleen omaa sisäistä logiikkansa ladata toidet.

Seuraavassa osiossa päivitämme TodosComponent datan käyttämiseksi kulmikäyttäjän avulla.

Käyttämällä ratkaistuja tietoja

Avaa app / src / todos / todos. komponentti. ts .

ngOnInit käsittelijä hakee toidot suoraan API: lta:

   julkinen ngOnInit    {Tämä. todoDataService. getAllTodos   . tilaa ((todos) => {Tämä. todos = todos;});}    

Nyt, kun Kulma-reititin hakee ToDon käyttämällä TodosResolveria , haluamme noutaa reititietoon TodosComponent reititietoihin API: n sijasta.

Reittitietojen käyttämiseksi meidän on tuettava ActivatedRoute kohteesta @ kulma / reititin :

   tuonti {ActivatedRoute} kohteesta @ @ kulma / reititin;    

ja käytä Semalt-riippuvuus-injektiota saadaksesi kahvan aktivoitua reittiä:

   rakentaja (yksityinen todoDataService: TodoDataService,yksityinen reitti: ActivatedRoute) {}    

Lopuksi päivitämme ngOnInit -käsittelijän saadaksemme reititietueet API: n sijasta:

   julkinen ngOnInit    {Tämä. reitti. tiedot. kartta ((data) => data ['todos']). tilaa ((todos) => {Tämä. todos = todos;});}    

ActivatedRoute näyttää reittitiedot havaittaviksi, joten koodimme tuskin muuttuu.

Korvataan tämä. todoDataService. getAllTodos ja tämä. reitti. tiedot. kartta ((data) => data ['todos']) ja kaikki muu koodi pysyy muuttumattomana.

Jos siirrät selaimesi osoitteeseen localhost: 4200 ja avaat verkko-välilehden, et enää näe kahta HTTP-pyyntöä, jotka hakevat toidet API: lta.

Tehtävä toteutettuna! Olemme onnistuneesti integroineet Semalt reitittimen sovelluksessamme!

Mielestämme kääritään, ajetaan yksikkökokeitamme:

     ng käytetään    

Yksikkökokeiden epäonnistuminen:

   Toteutunut 11/11 (1 FAILED)TodosComponentin pitäisi luoda FAILED'app-todo-list-header' ei ole tunnettu elementti    
TodoListHeaderComponent ja siten Angular valittaa siitä, että se ei tiedä app-todo-list-header TodosComponent elementti.

Korjaa tämä virhe antamalla app / src / todos / todos. komponentti. spec. ts ja lisää NO_ERRORS_SCHEMA TestBed vaihtoehtoja:

   ennen jokaista (async (   => {Testbed. configureTestingModule ({ilmoitukset: [TodosComponent],skeemat: [NO_ERRORS_SCHEMA]}). configureTestingModule ({ilmoitukset: [TodosComponent],skeemat: [NO_ERRORS_SCHEMA],tarjoajat: [TodoDataService,{tarjota: ApiService,useClass: ApiMockService}],}). compileComponents   ;}));    

, joka taas aiheuttaa toisen virheen:

   Toteutunut 11/11 (1 FAILED)TodosComponentin pitäisi luoda FAILEDEi palveluntarjoajaa ActivatedRoutelle!    

Lisään vielä yksi palveluntarjoaja ActivatedRoute testivaihtoehtoihin:

   ennen jokaista (async (   => {Testbed. configureTestingModule ({ilmoitukset: [TodosComponent],skeemat: [NO_ERRORS_SCHEMA],tarjoajat: [TodoDataService,{tarjota: ApiService,useClass: ApiMockService},{tarjota: ActivatedRoute,useValue: {tiedot: Observable. ja ({todos: []})}}],}). compileComponents   ;}));    

Osoitamme palveluntarjoajan ActivatedRoute: lle pilkottavan objektin, joka sisältää havaittavissa olevan datan ominaisuuden testattavan arvolle todos .

Yksikön testit menevät menestyksekkäästi:

   Suoritettu 11/11 SUCCESS    

Semalt! Sovelluksen käyttöönottoon tuotantoympäristöön voimme nyt ajaa:

     ng rakentaa --aot --ympäristö prod    

ja lähetä generoitu dist -hakemisto isäntäpalvelimellemme. Kuinka makea on se?

Käsittelemme paljon tässä artikkelissa, joten kerrotaan, mitä olemme oppineet.

Yhteenveto

Ensimmäisessä artikkelissa saimme tietää, miten:

  • aloittaa Todo-sovelluksen käyttämällä Angular CLI: tä
  • luo Todo luokan edustaa yksittäisiä todo
  • luoda TodoDataService -palvelun luomaan, päivittämään ja poistamaan todo: n
  • käyttää AppComponent -komponenttia näyttämään käyttöliittymän
  • levittää sovelluksemme GitHub-sivuille

Toisessa artikkelissa uudistettiin AppComponent , joka siirsi suurimman osan työstään:

  • a TodoListComponent näyttää listan todo: n
  • a TodoListItemComponent yksittäisen todo
  • a TodoListHeaderComponent luoda uuden todo
  • a TodoListFooterComponent näyttää kuinka monta todoa on jäljellä

Kolmannessa artikkelissa saimme tietää, kuinka:

  • luodaan pilkata REST API -hakemisto
  • tallentaa API-URL-osoitteen ympäristömuuttujaksi
  • muodostamaan ApiService kommunikoimaan REST API: n kanssa
  • ApiService päivittämään TodoDataService
  • päivittää AppComponent käsittelemään asynkronisia API-puheluita
  • luoda ApiMockService , jotta vältetään todelliset HTTP-puhelut ajettaessa yksikkötestejä

Tässä neljännessä artikkelissa saimme tietää:

  • miksi hakemus saattaa tarvita reititystä
  • mikä JavaScript reititin on
  • mitä kulmareititin on, miten se toimii ja mitä se voi tehdä sinulle
  • kuinka asettaa reitittimen ja määrittää reitit sovelluksessamme
  • kuinka kertoa Cornular reitittimen, missä laittaa komponentit DOM
  • miten tuntemattomia URL-osoitteita käsitellään gracefully
  • kuinka käyttää resolveria antaa Cornular reitittimen ratkaista tietoja

Kaikki tässä artikkelissa olevat koodit ovat saatavilla osoitteessa https: // github. com / SitePoint-editorit / kulmikas-todo-sovellus / puu / osa-4.

Viidennessä osassa toteutamme todentamisen estääkseen luvattoman pääsyn hakemuksemme käyttöön. com / avatar / ad9b5970be156b634406cb5c195cb6ec? s = 96 & d = mm & r = g "alt ="Johdatus komponenttireititykseen reitittimelläJohdatus komponenttireititykseen kulmaväylälläRelated Topics: Raaka JavaScriptnpmTools & Semalt "/>

Tapaa kirjailija
Jurgen Van de Moere
Forcen etupään arkkitehti - JavaScript ja AngularJS erikoistunut. Google Developer Expert. Voimistelija. Isä. Perhe mies. Angular Expressin luoja.
Johdatus komponenttireititykseen reitittimelläJohdatus komponenttireititykseen kulmaväylälläRelated Topics:
Raaka JavaScriptnpmTools & Semalt
Online kursseja kulma- ja kirjoituskirjeille
Todd Motto
Asiantuntijoiden johtamat online-harjoitukset AngularJS-, Angular- ja TypeScript-kursseja yksilöille ja joukkueille. Käytä kuponkikoodia 'SITEPOINT' kassalla saadaksesi 25% .
March 1, 2018