Opprett din første vinkelapp Lagre og få tilgang til data

I den første opplæringen av serien lærte vi hvordan vi skulle komme i gang for å opprette en Angular app. Etter at du har fullført denne opplæringen, bør du nå ha den første funksjonen Angular app med overskriften 'Fun Facts About Countries'. Før du lager noen komponenter som kan gjengis på skjermen, vil vi lage noen klasser og definere noen funksjoner som gjør disse komponentene nyttige.

I denne opplæringen vil vi fokusere på å skape en Land klasse som vil inneholde forskjellige egenskaper som vi ønsker å vise til brukeren. Vi vil da opprette en annen fil som heter country-data.ts. Denne filen inneholder informasjon om alle landene i appen vår. Vår tredje fil vil bli navngitt country.service.ts. Navnet kan høres fint ut, men filen vil bare inneholde a CountryService klasse med all nødvendig funksjonalitet for å hente og sortere informasjonen som er gitt av filen country-data.ts.

Opprette en landsklasse

Inne i src / app mappe av Angular app, opprett en fil som heter country.ts. Legg til følgende kode i den.

eksport klasse Land navn: streng; hovedstad: streng; område: nummer; befolkning: nummer; valuta: streng; gdp: nummer;  

Ovenstående TypeScript-kode definerer Land klasse med seks forskjellige egenskaper for å lagre informasjon om forskjellige land. Navnet på landet, dets hovedstad og dets valuta lagres som en streng. Imidlertid lagres områdene, befolkningen og BNP som et tall. Vi vil importere Land klasse i mange steder, så jeg har lagt til eksport søkeord før klassen definisjonen.

Skape et utvalg av land

Det neste trinnet inkluderer å opprette en country-data.ts fil for å lagre informasjonen om alle landene som en rekke Land objekter. Vi vil importere Land klasse i denne filen og deretter eksportere en konst oppkalt LAND som lagrer en rekke landobjekter. 

Her er koden for country-data.ts. Akkurat som country.ts, du må opprette denne filen inne i src / app mappe.

importer Country fra './country'; eksport const LAND: Land [] = [navn: 'Russland', hovedstad: 'Moskva', område: 17098246, befolkning: 144463451, valuta: 'Russisk rubel', gdp: 1283162, navn: 'Canada', hovedstad : 'Ottawa', område: 9984670, befolkning: 35151728, valuta: 'Kanadiske dollar', gdp: 159760, navn: 'Kina', hovedstad: 'Beijing', område: 9596961, befolkning: 1403500365, valuta: 'Renminbi (Yuan) ', gdp: 11199145, navn:' USA ', hovedstad:' Washington, DC ', område: 9525067, befolkning: 325365189, valuta:' United States Dollar ', gdp: 18569100 'Japan', hovedstad: 'Tokyo', område: 377972, befolkning: 12676200, valuta: 'Yen', gdp: 4939384]; 

Den første linjen i denne filen importerer Land klasse fra country.ts fil som er plassert i samme katalog. Hvis du fjerner denne linjen fra filen, vil TypeScript gi deg følgende feil:

Kan ikke finne navn 'Land'.

Uten import uttalelsen, vil TypeScript ikke ane hva en rekke typer Land midler. Så sørg for at du har importert riktig klasse og angitt plasseringen av country.ts riktig.

Etter import av Land klasse, vi går videre og lager en rekke Land objekter. Vi importerer denne gruppen av land for bruk i andre filer, så vi legger til en eksport søkeord til denne gruppen også. For tiden er det fem forskjellige Land objekter i arrayen. Hver av disse fem objektene gir nøkkelverdige par som viser navnet på en egenskap og dens verdi for en bestemt gjenstand eller et land.

Hvis du prøver å legge til en ekstra egenskap i arrayet som ikke er erklært inne i Land klasses Definisjon, vil du få følgende feil:

Objekt bokstavelig kan bare angi kjente egenskaper, og 'president' eksisterer ikke i typen 'Land'

I dette tilfellet forsøkte jeg å lagre navnet på presidenten som en string inne i en eiendom som heter president. Siden ingen slik eiendom ble erklært, fikk vi en feil. Noen ganger kan det være lurt å spesifisere en eiendom bare for bestemte objekter og ikke for andre. I slike tilfeller kan du merke eiendommen som er valgfritt inne i klassen definisjonen. Jeg har diskutert det mer detaljert i en veiledning som dekker TypeScript-grensesnitt.

For øyeblikket må du bare sørge for at navnene på alle egenskapene stemmer overens med navnene i klassedisplayet. Sørg også for at verdien av hver eiendom har samme type som deklarert i klassen definisjonen.

Opprette en CountryService-klasse

Etter å ha skapt vår Land klasse og LAND array, kan vi nå endelig skrive noen funksjoner for å behandle landsdataene. Vi må importere begge Land klasse og LAND array i vår servicefil. Filen må importere LAND array for å få tilgang til dataene. På samme måte må filen importere Land klasse for å få mening av dataene inne i LAND matrise.

Vi vil også importere andre avhengigheter som injiserbare fra vinkelkjerne for å gjøre vårt CountryService klasse tilgjengelig for injeksjonen til injeksjon i andre komponenter.

Når appen din vokser, må ulike moduler kommunisere med hverandre. La oss si det ModuleA krever ModuleB for å kunne fungere skikkelig. I slike tilfeller ville vi ringe ModuleB en avhengighet av ModuleA

Bare import av modulen vi trenger til en annen fil, fungerer mesteparten av tiden. Men noen ganger må vi bestemme om vi skal lage en enkelt forekomst av klasser fra ModuleB som vil bli brukt av hele appen, eller hvis vi skal opprette en ny forekomst hver gang modulen brukes. I vårt tilfelle vil vi injisere en enkelt forekomst av vår CountryService klasse gjennom hele appen.

Her er koden for country.service.ts:

importer Injectable fra '@ vinkel / kjerne'; importer Country fra './country'; importer COUNTRIES fra './country-data'; @Injectable () eksport klasse CountryService constructor ()  getCountries (): Land [] return COUNTRIES;  getPopulatedCountries (): Land [] return COUNTRIES.sort ((a, b) => bpopulation - a.population) .slice (0, 3);  getLargestCountries (): Land [] return COUNTRIES.sort ((a, b) => b.area - a.area) .slice (0, 3);  getGDPCountries (): Land [] return COUNTRIES.sort ((a, b) => b.gdp - a.gdp) .slice (0, 3);  getCountry (navn: streng): Land return COUNTRIES.find (land => country.name === navn);  

en @injectable dekoratør brukes til å identifisere en tjeneste klasse som kan kreve injisert avhengigheter. Men legger til @injectable å service klasser er en nødvendig koding stil, så vi gjør det uansett.

Deretter skriver vi forskjellige metoder for klassen som tar LAND array og enten returnere den direkte eller sortere den ved hjelp av bestemte kriterier og deretter returnere en del av arrayet. 

De getCountries () Metoden forventes å returnere alle Land objekter, og så returnerer det hele LAND array uten å gjøre noen endringer i det.

De getPopulatedCountries () tar LAND array og sorterer den i synkende rekkefølge basert på befolkningen i forskjellige land. Vi bruker deretter Array.slice () -metoden for å returnere de tre første landene (med indeksene 0, 1 og 2) fra gruppen. De getLargestCountries () og getGDPCountries () metoder fungerer på lignende måte.

De getCountry () Metoden tar navn som argument og returnerer landobjektet hvis navnegenskap har samme verdi som det medfølgende navnargumentet.

Inkludert CountryService i app.module.ts

En tjeneste du oppretter er bare en klasse i Angular til du har registrert den med en Angular Dependency Injector. En vinkelinjektor vil være den som er ansvarlig for å opprette serviceeksempler og injisere dem i ulike klasser som trenger den tjenesten. Vi må registrere en tjeneste hos en leverandør før injektoren kan skape den tjenesten.

Det er to vanlige måter å registrere hvilken tjeneste som helst: bruker a @Komponent leverandør eller bruker @NgModule forsørger. Bruker @Komponent Leverandøren er fornuftig når du vil begrense tilgangen til en tjeneste til en bestemt komponent og alle de nestede komponentene. Bruker @NgModule Leverandøren gir mening når du vil at flere komponenter skal ha tilgang til tjenesten.

I vårt tilfelle vil vi bruke CountryService med flere komponenter i vår app. Dette betyr at vi skal registrere det med @NgModule leverandør en gang, i stedet for å registrere den separat med @Komponent leverandør av hver komponent. 

Foreløpig din app.module.ts filen skal se slik ut:

importer BrowserModule fra '@ vinkel / plattform-nettleser'; importer NgModule fra '@ vinkel / kjerne'; importer AppComponent fra './app.component'; @NgModule (deklarasjoner: [AppComponent], import: [BrowserModule], leverandører: [], bootstrap: [AppComponent]) eksportklasse AppModule  

Legg til en importerklæring til app.module.ts fil og legg til tjenesten til @NgModule leverandører array. Etter å ha gjort disse endringene, din app.module.ts filen skal se slik ut:

importer BrowserModule fra '@ vinkel / plattform-nettleser'; importer NgModule fra '@ vinkel / kjerne'; importer AppComponent fra './app.component'; importer CountryService fra './country.service'; @NgModule (declarations: [AppComponent], import: [BrowserModule], leverandører: [CountryService], bootstrap: [AppComponent]) eksportklasse AppModule  

De CountryService klassen vil nå være tilgjengelig for alle komponentene som vi lager for vår app.

Siste tanker

Opprett tre filer med navnet country.ts, country-data.ts, og country.service.ts avslutter den andre opplæringen av denne serien.

De country.ts filen brukes til å lage en Land klasse med forskjellige egenskaper som navn, valuta, befolkning, område osv country-data.ts filen brukes til å lagre en rekke landobjekter som har informasjon om forskjellige land. De country.service.ts filen inneholder en tjenesteklasse med forskjellige metoder for å få tilgang til landsdataene fra LAND array. Skrive alle disse metodene separat i en serviceklasse tillater oss å få tilgang til dem i forskjellige appkomponenter fra en sentral plassering.

I den siste delen registrerte vi vår tjeneste med @NgModule leverandør for å gjøre den tilgjengelig for bruk i forskjellige komponenter.

Den neste opplæringen vil vise deg hvordan du oppretter tre forskjellige komponenter i appen din for å vise landdetaljer og en liste over land.