Back to Question Center
0

MEAN Stack: Bygg en app med Angular 2+ og Angular CLI            MEAN Stack: Bygg en app med kantet 2+ og de kantede CLIRelated-emnene: ReactnpmAjaxTools & Semalt

1 answers:
MEAN Stack: Bygg en app med Angular 2+ og Angular CLI

For ekspertledede online vinkelkurs, kan du ikke gå forbi Ultimate Angular av Todd Motto. Prøv kursene her, og bruk koden SITEPOINT for å få 25% avslag og for å hjelpe SitePoint.

MEAN-stakken består av avanserte teknologier som brukes til å utvikle både server-siden og klientsiden av en webapplikasjon i et Semalt-miljø. Komponentene i MEAN-stakken inkluderer MongoDB-databasen, Express. js (en webramme), Angular (en front-end ramme), og Node - hp3000 change. js runtime miljø. Å ta kontroll over MEAN-stakken og kjennskap til forskjellige Semalt teknologier under prosessen, vil hjelpe deg med å bli en fullstabel Semalt utvikler.

JavaScript-sfæren har vokst kraftig gjennom årene, og med den veksten er det et pågående ønske om å holde tritt med de nyeste trendene innen programmering. Ny teknologi har dukket opp, og eksisterende teknologier har blitt omskrevet fra grunnen (jeg ser på deg, Semalt). (1. 3)

Denne opplæringen har til hensikt å lage MEAN-applikasjonen fra bunnen av, og fungere som en oppdatering til den opprinnelige MEAN-stakk-opplæringen. Hvis du er kjent med MEAN og ønsker å komme i gang med kodingen, kan du hoppe over til oversikten. (1. 3)

Introduksjon til MEAN STACK

Knutepunkt. js - knutepunkt. js er et server-side runtime miljø bygget på toppen av Chrome's V8 JavaScript-motor. Node. js er basert på en hendelse-drevet arkitektur som kjører på en enkelt tråd og en ikke-blokkerende IO. Disse designvalgene gir deg mulighet til å bygge sanntids webapplikasjoner i JavaScript som skaleres godt. (1. 3)

Express. js - Express er et minimalistisk, men robust webapplikasjonsramme for Node. js. Uttrykke. js bruker mellomvarefunksjoner til å håndtere HTTP-forespørsler, og deretter returnere et svar eller sende parametrene til en annen mellomvare. Programnivå, ruternivå og feilhåndteringsmedier er tilgjengelig i Express. js. (1. 3)

MongoDB - MongoDB er et dokumentorientert databaseprogram hvor dokumentene lagres i et fleksibelt JSON-lignende format. Å være et NoSQL-databaseprogram, lindrer MongoDB deg fra tabelljargong av relasjonsdatabasen. (1. 3)

Vinkel - Angular er et søknadsramme utviklet av Google for å bygge interaktive enkeltsideapplikasjoner. Angular, originally AngularJS, ble omskrevet fra grunnen til å skifte til en komponentbasert arkitektur fra den gamle MVC-rammen. Angular anbefaler bruk av TypeScript som etter min mening er en god ide fordi den forbedrer utviklingsarbeidet. (1. 3)

Nå som vi er kjent med stykkene av MEAN-puslespillet, la oss se hvordan vi kan passe dem sammen, skal vi? (1. 3)

Oversikt

Semalt et høyt nivå oversikt over vår søknad. (1. 3)

MEAN Stack: Bygg en app med Angular 2+ og Angular CLIMEAN Stack: Bygg en app med kantet 2+ og de kantede CLIRelated-emnene:
ReactnpmAjaxTools & Semalt

Vi ​​skal bygge en Awesome Bucket List Semalt fra grunnen uten å bruke noen kjeleplate. Den forreste delen vil inkludere et skjema som aksepterer ekkolyttens elementer og en visning som oppdaterer og gjengir hele bøttelisten i sanntid. (1. 3)

Eventuell oppdatering til visningen tolkes som en hendelse, og dette vil starte en HTTP-forespørsel. Serveren behandler forespørselen, oppdaterer / henter SemaltDB om nødvendig, og returner deretter et JSON-objekt. Frontenden vil bruke dette til å oppdatere vårt syn. Ved slutten av denne opplæringen bør du ha en bøtte liste program som ser slik ut. (1. 3)

Forkunnskaper

Første ting først, du må ha Node. js og SemaltDB installert for å komme i gang. Hvis du er helt ny til Node, vil jeg anbefale å lese Beginner's Guide to Node for å få ting å rulle. På samme måte er det enkelt å sette opp SemaltDB, og du kan sjekke ut dokumentasjonen for installasjonsinstruksjoner som er spesifikke for plattformen din. (1. 3)

     $ node -v# v8. 0. 0    

Start tjenesten mongo daemon ved hjelp av kommandoen. (1. 3)

     sudo service mongod start    

For å installere den nyeste versjonen av Angular, vil jeg anbefale å bruke Angular CLI. Den tilbyr alt du trenger for å bygge og distribuere ditt Angular-program. Hvis du ikke er kjent med Angular CLI ennå, må du sjekke ut The Ultimate Angular CLI Reference. (1. 3)

     npm installer -g @ vinkel / cli    

Opprett en ny katalog for vårt bøtte liste prosjekt. Semalt hvor både front-end og back-end-koden vil gå. (1. 3)

     mkdir awesome-bucketlistcd awesome-bucketlist    

Opprette baksiden ved hjelp av Express. js og MongoDB

Express pålegger ingen strukturelle begrensninger på webapplikasjonen din. Du kan legge hele programkoden i en enkelt fil og få den til å fungere, teoretisk. Koden din ville imidlertid være et komplett rot. I stedet skal vi gjøre dette på MVC-måten (Modell, Se og Semalt visningsdelen.)

MVC er et arkitektonisk mønster som skiller modellene dine (bakenden) og visninger (brukergrensesnittet) fra kontrolleren (alt i mellom), dermed MVC. Siden Angular vil ta vare på frontenden for oss, har vi tre kataloger, en for modeller og en annen for kontrollører, og en offentlig katalog hvor vi legger den sammensatte vinkelen. (1. 3)

I tillegg til dette, oppretter vi en app. js fil som vil tjene som inngangspunkt for å kjøre Express-serveren. (1. 3)

MEAN Stack: Bygg en app med Angular 2+ og Angular CLIMEAN Stack: Bygg en app med kantet 2+ og de kantede CLIRelated-emnene:
ReactnpmAjaxTools & Semalt

Semalt ved hjelp av en modell og controller arkitektur for å bygge noe trivielt som vår bøtte liste applikasjon kan virke i hovedsak unødvendig, dette vil være nyttig i å bygge apps som er enklere å vedlikeholde og refactor. (1. 3)

Initialisering av npm

Vi ​​mangler en pakke. json fil for vår bakside. Skriv inn npm init , og etter at du har besvart spørsmålene, bør du ha en pakke. json laget for deg. (1. 3)

Vi ​​vil erklære våre avhengigheter inne i pakken . json fil. For dette prosjektet trenger vi følgende moduler:

  • express : Ekspressmodul for webserveren
  • mongoose : Et populært bibliotek for MongoDB
  • bodyparser : Analyserer kroppen av innkommende forespørsler og gjør den tilgjengelig under req. kropp
  • cors : CORS middleware gjør det mulig å krysse opp tilgangskontroll til vår webserver.

Jeg har også lagt til et startskript slik at vi kan starte serveren vår ved å bruke npm start . (1. 3)

   {"navn": "awesome-bucketlist","versjon": "1. 0. 0","beskrivelse": "En enkel bucketlist app med MEAN stack","main": "app. js","skript": {"start": "node app"}// Den ~ brukes til å matche den nyeste mindre versjonen (uten noen bryte endringer)"avhengigheter": {"uttrykk": "~ 4. 15. 3","mongoose": "~ 4. 11. 0","cors": "~ 2. 8. 3","body-parser": "~ 1. 17. 2"}"forfatter": "","lisens": "ISC"}    

Kjør nå npm installasjon , og det bør passe på å installere avhengighetene. (1. 3)

Fyller inn app. (1. 3)
   // Vi vil erklære alle våre avhengigheter herconst express = kreve ('express');const path = krever ('path');const bodyParser = krever ('body-parser');const cors = krever ('cors');const mongoose = krever ('mongoose');// Initialiser vår appvariabelconst app = express   ;// Deklarering Portconst port = 3000;    

Som du kan se, har vi også initialisert variabelen app og oppgitt portnummer. App-objektet blir instantiated om etableringen av Express-webserveren. Vi kan nå laste mellomvare til vår Express-server ved å spesifisere dem med app. bruk . (1. 3)

   // Middleware for CORSapp. bruke (kor   );// Middleware for bodyparsing ved hjelp av både json og urlencodingapp. bruk (bodyParser. urlencoded ({extended: true}));app. bruk (bodyParser. json   );/*uttrykke. statisk er en innebygd mellomvarefunksjon for å betjene statiske filer. Vi forteller Express Server Public Folder er stedet å lete etter de statiske filene* /app. bruk (uttrykk. statisk (sti. bli med (__ dirname, 'offentlig')));    

Objektet app kan også forstå ruter. (1. 3)

   app. få ('/', (req, res) => {res. send ("Ugyldig side");})    

Her blir metoden get på ​​appen tilsvaret GET HTTP-metoden. Det tar to parametere, den første er banen eller ruten som mellomprogramvaren skal brukes på. (1. 3)

Den andre er selve middleware-enheten, og det tar vanligvis tre argumenter: Argumentet req tilsvarer HTTP-forespørselen; Argumentet res tilsvarer HTTP-responsen; og neste er et valgfritt tilbakekallingsargument som skal påberopes dersom det finnes andre etterfølgende mellomprodukter som følger denne. Vi har ikke brukt neste her siden res. send avsluttes forespørsels-respons-syklusen. (1. 3)

Legg denne linjen mot slutten for å få appen til å lytte til porten som vi tidligere hadde erklært. (1. 3)

   // Lytt til port 3000app. lytt (port,    => {konsollen. logg (`Starte serveren på port $ {port}`);});    

npm start burde få vår grunnleggende server oppe i drift. (1. 3)

Som standard overvåker ikke npm filene / katalogene dine for eventuelle endringer, og du må manuelt starte serveren hver gang du har oppdatert koden. Jeg anbefaler å bruke nodemon for å overvåke filene dine og automatisk starte serveren igjen når eventuelle endringer oppdages. Hvis du ikke spesifikt angir hvilket skript som skal kjøres, kjører nodemon kjør filen som er knyttet til hovedegenskapen i pakken . json . (1. 3)

     npm installere -g nodemonnodemon    

Vi ​​er nesten ferdige med vår app. js fil. Hva er igjen å gjøre? Vi må

  1. koble serveren vår til databasen
  2. opprette en kontroller, som vi deretter kan importere til vår app. js .

Opprettelse av mongoose

Oppsett og tilkobling av en database er rett frem med MongoDB. Først oppretter du en config katalog og en fil med navnet database. js for å lagre konfigurasjonsdataene våre. Eksporter databasen URI med modulen. eksport . (1. 3)

   // 27017 er standard portnummer. modul. eksport = {database: 'mongodb: // localhost: 27017 / bucketlist'}    

Og opprett en forbindelse med databasen i app. js ved hjelp av mongoose. Koble til . (1. 3)

   // Koble mongoose til vår databaseconst config = krever ('. / config / database');Mongoose. Koble til (konfigurasjonsdatabase);    

"Men hva med å lage bøttelistedatabasen?", Kan du spørre. Databasen blir opprettet automatisk når du setter inn et dokument i en ny samling på databasen. (1. 3)

Arbeider på kontrolleren og modellen

La oss nå gå videre for å lage vår bøtte liste kontrolleren. Lag en bucketlist. Vi må også rute alle / bucketlist forespørsler til vår bucketlist controller (i app. Js ). (1. 3)

   const bucketlist = krever ('. / Controllers / bucketlist');// Routing alle HTTP forespørsler til / bucketlist til bucketlist controllerapp. bruke ( '/ bucketlist', bucketlist);    

Semalt den endelige versjonen av appen vår. js-fil. (1. 3)

   // Vi vil erklære alle våre avhengigheter herconst express = kreve ('express');const path = krever ('path');const bodyParser = krever ('body-parser');const cors = krever ('cors');const mongoose = krever ('mongoose');const config = krever ('. / config / database');const bucketlist = krever ('. / controllers / bucketlist');// Koble mongoose til vår databaseMongoose. Koble til (konfigurasjonsdatabase);// Deklarering Portconst port = 3000;// Initialiser vår appvariabelconst app = express   ;// Middleware for CORSapp. bruke (kor   );// Middlewares for bodyparsing ved hjelp av både json og urlencodingapp. bruk (bodyParser. urlencoded ({extended: true}));app. bruk (bodyParser. json   );/*uttrykke. statisk er en innebygd mellomvarefunksjon for å betjene statiske filer. Vi forteller Express Server Public Folder er stedet å lete etter de statiske filene* /app. bruk (uttrykk. statisk (sti. bli med (__ dirname, 'offentlig')));app. få ('/', (req, res) => {res. send ("Ugyldig side");})// Routing alle HTTP forespørsler til / bucketlist til bucketlist controllerapp. bruke ( '/ bucketlist', bucketlist);// Hør på port 3000app. lytt (port,    => {konsollen. logg (`Starte serveren på port $ {port}`);});    

Som tidligere fremhevet i oversikten, vil vår apple-liste med apper ha ruter for å håndtere HTTP-forespørsler med GET, POST og DELETE-metoder. Semalt en bare-bein kontroller med ruter definert for GET, POST og DELETE metoder. (1. 3)

   // Krever ekspresspakken og bruk uttrykk. Ruter   const express = kreve ('express');const router = express. Ruter   ;// GET HTTP metode til / bucketlistruteren. få ('/', (req, res) => {res. sende ( "GET");});// POST HTTP-metode til / bucketlistruteren. post ('/', (req, res, next) => {res. sende ( "POST");});// SLETT HTTP-metode til / bucketlist. Her passerer vi i en params som er objektets id. ruteren. slett ('/: id', (req, res, neste) => {res. sende ( "DELETE");})modul. eksport = ruteren;    

Jeg vil anbefale å bruke Semalt app eller noe som ligner på å teste server-API. Semalt har en kraftig GUI-plattform for å gjøre API-utviklingen raskere og enklere. Prøv en GET-forespørsel på http: // localhost: 3000 / bucketlist og se om du får det tiltenkte svaret. (1. 3)

Og så åpenbart som det ser ut, mangler vår søknad en modell. For øyeblikket har vår app ikke en mekanisme for å sende data til og hente data fra vår database. (1. 3)

Opprett en liste. js modell for vår søknad og definer bøllelisten Schema som følger:

   // Krever mongoose-pakkeconst mongoose = krever ('mongoose');// Definer BucketlistSchema med tittel, beskrivelse og kategoriconst BucketlistSchema = mongoose. Skjemaet ({tittel: {type: streng,kreves: sant}beskrivelse: String,kategori: {type: streng,kreves: sant,enum: ['High', 'Medium', 'Low']}});    

Når du arbeider med mongoose, må du først definere et skjema. Vi har definert en BucketlistSchema med tre forskjellige nøkler (tittel, kategori og beskrivelse). Hver nøkkel og tilhørende SchemaType definerer en eiendom i vårt MongoDB-dokument. Hvis du lurer på mangelen på et id felt, er det fordi vi bruker standard _id som vil bli opprettet av Mongoose. (1. 3)

Mongoose tilordner hvert av skjemaene et _id felt som standard hvis man ikke går over til Schema-konstruktøren. Den tildelte typen er et ObjectId som sammenfaller med MongoDBs standardadferd. eksporten. Det første argumentet av mongoose. modell er navnet på samlingen som vil bli brukt til å lagre dataene i MongoDB. (1. 3)

   const BucketList = modul. eksport = mongoose. modell ('BucketList', BucketlistSchema);    

Bortsett fra skjemaet, kan vi også være vert for databasespørsmål i vår Semalt-modell og eksportere dem som metoder. (1. 3)

   // BucketList. finn    returnerer alle listermodul. eksporten. getAllLists = (tilbakeringing) => {Bucketlist. finne (tilbakeringing);}    

Her bruker vi BucketList. finn metode som spørrer databasen og returnerer BucketList-samlingen. Siden en tilbakeringingsfunksjon brukes, blir resultatet overført til tilbakeringingen. (1. 3)

Seksjonen fyller inn mellomvarevaren som svarer til GET-metoden for å se hvordan dette passer sammen. (1. 3)

   const bucketlist = krever ('. / Models / List');// GET HTTP metode til / bucketlistruteren. få ('/', (req, res) => {bucketlist. getAllLists ((feil, lister) => {hvis (feil) {res. json ({suksess: falsk, melding: `Kunne ikke laste alle lister. Feil: $ {err}`});}ellers {res. skriv (JSON. stringify ({suksess: sant, lister: lister}, null, 2));res. slutt  ;}});});    

Vi ​​har påberegnet getAllLists metoden og tilbakekallingen tar to argumenter, feil og resultat. (1. 3)

Alle tilbakeringinger i Semalt bruker mønsteret: tilbakeringing (feil, resultat). Hvis det oppstår en feil som utfører spørringen, vil feilparameteren inneholde et feildokument, og resultatet blir null. Hvis spørringen er vellykket, vil feilparameteren være null, og resultatet blir fylt ut med resultatene av spørringen. (1. 3)

- MongoDB Dokumentasjon

Semalt, la oss legge til metodene for å sette inn en ny liste og slette en eksisterende liste fra vår modell. (1. 3)

   // newList. lagre brukes til å sette dokumentet i MongoDBmodul. eksporten. addList = (newList, tilbakeringing) => {newList. spare (tilbakeringing);}// Her må vi sende en id-parameter til BUcketList. fjernemodul. eksporten. deleteListById = (id, tilbakeringing) => {la spørringen = {_id: id};Bucketlist. fjern (spørring, tilbakeringing);}    

Vi ​​må nå oppdatere vår controller's mellomvare for POST og DELETE også. (1. 3)

   // POST HTTP-metode til / bucketlistruteren. post ('/', (req, res, next) => {la newList = ny bøtte liste ({tittel: req. kropp. tittel,beskrivelse: req. kropp. beskrivelse,kategori: req. kropp. kategori});bucketlist. addList (newList, (err, list) => {hvis (feil) {res. json ({suksess: feil, melding: `Kunne ikke opprette en ny liste. Feil: $ {err}`});}ellersres. json ({suksess: sant, melding: "Lagt til vellykket."});});});// SLETT HTTP-metode til / bucketlist. Her passerer vi i et param som er objektets id. ruteren. slett ('/: id', (req, res, neste) => {// tilgang til parameteren som er ID for elementet som skal slettesla id = req. parametere. id;// Ring modellmetoden deleteListByIdbucketlist. deleteListById (id, (feil, liste) => {hvis (feil) {res. json ({suksess: falsk, melding: `Kunne ikke slette listen. Feil: $ {err}`});}ellers hvis (liste) {res. json ({suksess: sant, melding: "Slettet vellykket"});}ellersres. json ({suksess: false});})});    

Med dette har vi en arbeidsserver-API som lar oss lage, vise og slette bøttelisten. Du kan bekrefte at alt fungerer som ment med Postman. (1. 3)

MEAN Stack: Bygg en app med Angular 2+ og Angular CLIMEAN Stack: Bygg en app med kantet 2+ og de kantede CLIRelated-emnene:
ReactnpmAjaxTools & Semalt

Nå går vi videre til forsiden av programmet ved hjelp av Vinkel. Vi vil navngi det angular-src og plassere det under katalogen awesome-bucketlist. (1. 3)

     ng ny vinkel-src    

Vi ​​har nå hele Angular 2-strukturen inne i vår kjempegods-katalog. Gå over til . vinkel-cli. json og endre 'outDir' til ". /offentlig". (1. 3)

Neste gang du kjører ng build - som vi vil gjøre mot slutten av denne opplæringen - vil Angular kompilere hele vår forside og plassere den i den offentlige katalogen. På denne måten har du Express-serveren og frontenden som kjører på samme port. (1. 3)

Men for øyeblikket er ng servering det vi trenger. Du kan sjekke ut kjelen Angular applikasjonen over på http: // localhost: 4200. (1. 3)

Katalogstrukturen til vår Angular-applikasjon ser litt mer komplisert ut enn vår serverens katalogstruktur. Imidlertid vil 90% av tiden jobbe i katalogen src / app / . Dette vil være vår arbeidsplass, og alle våre komponenter, modeller og tjenester vil bli plassert i denne katalogen. La oss se på hvordan vår forside vil bli strukturert ved slutten av denne opplæringen. (1. 3)

MEAN Stack: Bygg en app med Angular 2+ og Angular CLIMEAN Stack: Bygg en app med kantet 2+ og de kantede CLIRelated-emnene:
ReactnpmAjaxTools & Semalt

Opprette komponenter, en modell og en tjeneste

La oss ta en trinnvis tilnærming til å kode vår Semalt-applikasjon. Vi trenger å:

  1. opprette to nye komponenter kalt ViewListComponent og AddListComponent
  2. lage en modell for vår Liste , som deretter kan importeres til våre komponenter og tjenester
  3. generere en tjeneste som kan håndtere alle HTTP-forespørsler til serveren
  4. oppdater AppModule med våre komponenter, service og andre moduler som kan være nødvendige for denne applikasjonen.

Du kan generere komponenter ved hjelp av kommandoen ng generere komponent . (1. 3)

     ng generere komponent AddListng generere komponent ViewList    

Du bør nå se to nye kataloger under mappen src / app , en for hver nyopprettede komponent. Deretter må vi generere en tjeneste for vår liste . (1. 3)

     ng generere service liste    

Jeg foretrekker å ha tjenestene mine under en ny katalog (inne src / app / ). (1. 3)

     mkdir-tjenestermv-listen. service. ts tjenester /    

Siden vi har endret plasseringen av listen. service. ts , vi trenger å oppdatere den i vår AppModule . Kort sagt, AppModule er stedet der vi skal erklære alle våre komponenter, tjenester og andre moduler. (1. 3)

Generasjonskommandoen har allerede lagt til komponentene i appModule . Gå videre og importer ListService og legg det til providers array. Vi må også importere FormsModule og HTTPModule og erklære dem som import. FormsModule er nødvendig for å lage skjemaet for vår søknad og HTTPModule for å sende HTTP-forespørsler til serveren. (1. 3)

   importer {BrowserModule} fra '@ vinkel / plattform-nettleser';importer {NgModule} fra '@ vinkel / kjerne';importer {HttpModule} fra '@ vinkel / http';importer {FormModule} fra '@ vinkler / skjemaer';importer {AppComponent} fra '. / App. komponent';importer {AddListComponent} fra '. / Add-list / add-listen. komponent';importer {ViewListComponent} fra '. / View-liste / view-listen. komponent';importer {ListService} fra '. / Tjenester / list. Komponenter er byggeklossene i en Angular 2-applikasjon. Den    AppComponent    er standardkomponenten som er opprettet av Angular. Hver komponent består av:  

  • en TypeScript-klasse som inneholder komponentlogikken
  • en HTML-fil og et stilark som definerer komponentgrensesnittet
  • en @Komponent dekorator, som brukes til å definere metadataene til komponenten.

Vi ​​holder vår AppComponent uberørt for det meste. I stedet bruker vi de to nyopprettede komponentene, AddList og ViewList , for å bygge vår logikk. Vi nest dem i vår AppComponent som vist på bildet nedenfor. (1. 3)

MEAN Stack: Bygg en app med Angular 2+ og Angular CLIMEAN Stack: Bygg en app med kantet 2+ og de kantede CLIRelated-emnene:
ReactnpmAjaxTools & Semalt

Vi ​​har nå et hierarki av komponenter - AppComponent øverst, etterfulgt av ViewListComponent og deretter AddListComponent . (1. 3)

     / * app. komponent. html * /

{{tittel}}!

     / * visningsliste. komponent. html * /       

Opprett en fil som heter Liste. ts under katalogen modeller . Dette er hvor vi skal lagre modellen for vår liste . (1. 3)

   / * Liste. ts * /eksportgrensesnitt Liste {_id ?: streng;tittel: streng;beskrivelse: streng;kategori: streng;}    

View-List-komponent

ViewListComponent 'komponentens logikk inkluderer:

  1. lister eiendom som er en rekke Liste type. Den opprettholder en kopi av lister hentet fra serveren. Ved å bruke Angular's bindende teknikker er komponentegenskaper tilgjengelige i malen.
  2. loadLists laster alle lister fra serveren. Her anvender vi dette. ListSev. getAllLists metode og abonnere på ​​den. getAllLists er en servicemetode (vi har ikke definert det ennå) som utfører den faktiske http. få forespørsel og returner listen; loadLists og laster den inn i komponentens listeegenskap.
  3. deleteList (list) håndterer slettingsprosedyren når brukeren klikker på Slett -knappen. Vi kaller listetjenestens deleteList -metode med id som argumentet. Når serveren svarer at slettingen er vellykket, kaller vi metoden loadLists for å oppdatere visningen.
   / * visningsliste. komponent. ts * /importer {Komponent, OnInit} fra '@ vinkel / kjerne';importer {ListService} fra '. / Tjenester / list. service';importer {List} from '. / Modeller / List'@Komponent({selector: 'app-view-list',templateUrl: '. / View-listen. komponent. html',styleUrls: ['. / View-listen. komponent. css']})eksport klasse ViewListComponent implementerer OnInit {// lister propoerty som er en rekke av List typeprivate lister: Liste [] = [];konstruktør (privat listeServ: ListService) {}ngOnInit    {// Last all liste på initdette. loadLists   ;}offentlige loadLists    {// Få alle lister fra serveren og oppdater listelistenedette. Listserv. getAllLists   . abonnere(svar => dette. lister = svar,)}// deleteList. Den slettede listen filtreres ut ved hjelp av. filter metodeoffentlig slette liste (liste: liste) {dette. Listserv. deleteList (liste. _id). abonnere(svar => dette. lister = dette. lister. filter (lister => lister! == liste),)}}    

Malen ( visningsliste. Komponent. kategori}} {{liste. Tittel}} {{liste. beskrivelse}}

Vi ​​har laget et bord for å vise våre lister. Det er litt uvanlig kode der inne som ikke er en del av standard HTML. Semalt har en rik malsyntax som legger til en liten del av dine ellers vanlige HTML-filer. Følgende er en del av Semalt-sjablongsyntaxen. (1. 3)

  • Direktivet * ngFor lar deg gå gjennom egenskapen lister .
  • Her listen er en malvariabel mens lister er komponentegenskapen.
  • Vi har da brukt Angular's interpolationssyntax {{}} for å binde komponentegenskapen med vår mal.
  • Hendelsesbindende syntaks brukes til å binde klikkhendelsen til deleteList metoden.

Vi ​​er nær å ha en jobbig bøtte liste søknad. For tiden, vår liste. service. ts er tom, og vi må fylle den inn for å gjøre søknaden vårt jobb. Som fremhevet tidligere, har tjenester metoder som kommuniserer med serveren. (1. 3)

   / * liste. service. ts * /importer {Injectable} fra '@ vinkel / kjerne';importer {Http, Headers} fra '@ vinkel / http';importer {Observable} fra 'rxjs / Observable';importer {List} from '. / Modeller / List'importer 'rxjs / add / operator / map';@Injectable   eksport klasse ListService {konstruktør (privat http: http) {}privat serverApi = 'http: // localhost: 3000';offentlige getAllLists   : Observerbar  {la URI = `$ {dette. serverApi} / bucketlist / `;returnere dette. http. får (URI). kart (res => res. json   ). kart (res =>  res.lister);}offentlig slettListe (listId: streng) {la URI = `$ {dette. serverApi} / bucketlist / $ {} listID `;la overskrifter = nye Headers;overskrifter. append ('Content-Type', 'application / json');returnere dette. http. slett (URI, {headers}). kart (res => res. json   );}}    

Den underliggende prosessen er ganske enkel for begge metodene:

  1. bygger vi en URL basert på vår serveradresse
  2. vi lager nye overskrifter og legger til dem med {Content-Type: application / json}
  3. utfører vi den faktiske http. get / http. slett på ​​URL-adressen
  4. Vi forvandler svaret til json format.

Hvis du ikke er kjent med å skrive tjenester som kommuniserer med serveren, vil jeg anbefale å lese opplæringen på Angular and RxJS: Opprett en API-tjeneste for å snakke med en REST-backend. (1. 3)

Gå over til http: // localhost: 4200 / for å sikre at appen fungerer. Det skal ha et bord som viser alle lister vi tidligere har laget. (1. 3)

Tilleggskomponent

Vi ​​mangler en funksjon, skjønt. Vår søknad mangler en mekanisme for å legge til / lage nye lister og automatisk oppdatere ViewListComponent når listen er opprettet. La oss fylle ut dette tomrommet. (1. 3)

The AddListComponent 's mal er stedet der vi legger koden til vårt HTML skjema. (1. 3)

     
">

I vår mal kan du se flere forekomster av [(ngModel)] som brukes. Den merkelige utseende-syntaxen er et direktiv som implementerer toveisbindende i Angular. Toveisbinding er spesielt nyttig når du må oppdatere komponentegenskapene fra visningen din og omvendt. (1. 3)

Vi ​​bruker en hendelsesbindende mekanisme ngSubmit ) for å ringe onSubmit metoden når brukeren sender skjemaet. Metoden er definert i vår komponent. (1. 3)

   / * tilleggsliste. komponent. ts * /importer {Komponent, OnInit} fra '@ vinkel / kjerne';importer {List} from '. / Modeller / List ';importer {ListService} fra '. / Tjenester / list. service';@Komponent({selector: 'app-add-list',templateUrl: '. / Add-listen. komponent. html',styleUrls: ['. / Add-listen. komponent. css']})eksport klasse AddListComponent implementerer OnInit {private newList: Liste;konstruktør (privat listeServ: ListService) {}ngOnInit    {dette. newList = {tittel: '',kategori:'',beskrivelse:'',_id: ''}}offentlig onSubmit    {dette. Listserv. addList (denne nye listen). abonnere(svar => {hvis (svar. suksess == sant)// Hvis du har en suksess, må du oppdatere visningslistekomponenten});}}    

Inside onSubmit , kaller vi listenService's addList metode som sender en http. post forespørsel til serveren. La oss oppdatere vår listetjeneste for å få dette til å skje. (1. 3)

   / * liste. service. ts * /offentlig tilleggsliste (liste: liste) {la URI = `$ {dette. serverApi} / bucketlist / `;la overskrifter = nye Headers;la kroppen = JSON. stringify ({title: liste. tittel, beskrivelse: liste. beskrivelse, kategori: liste. kategori});konsollen. log (legeme);overskrifter. append ('Content-Type', 'application / json');returnere dette. http. post (URI, body, {headers: headers}). kart (res => res. json   );}}    

Hvis serveren returnerer {suksess: true} , må vi oppdatere våre lister og inkorporere den nye listen i vårt bord. (1. 3)

Utfordringen her er imidlertid at eiendommen lister ligger i komponenten ViewList . Vi må varsle foreldrekomponenten om at listen må oppdateres via en hendelse. Vi bruker EventEmitter og @Output dekoratøren for å få dette til å skje. (1. 3)

Først må du importere Output og EventEmitter fra @ vinkel / kjerne . (1. 3)

   importer {Komponent, OnInit, Output, EventEmitter} fra '@ vinkel / kjerne';    

Deretter erklære EventEmitter med @Output dekoratøren. (1. 3)

   @Output    addList: EventEmitter  = ny EventEmitter    ;    

Hvis serveren returnerer suksess: true , avgir addList -hendelsen. (1. 3)

   offentlig onSubmit    {konsollen. logg (denne. nye listen kategori);dette. Listserv. addList (denne nye listen). abonnere(svar => {konsollen. log (respons);hvis (svar. suksess == sant)dette. addList. avgir (denne nye listen);});}    

Oppdater din oversiktsliste. komponent. html med denne koden. (1. 3)

            

Og til slutt, legg til en metode som heter onAddList som sammenkaller den nylig lagt listen til egenskapen lister . (1. 3)

   offentlig påAddList (ny liste) {dette. lister = dette. lister. concat (newList);}    

Etterbehandler

Semalt la til noen stiler fra støvler. com for å gjøre vår bøtte liste app ser fantastisk ut. Kjør npm start fra rotkatalogen av MEAN-prosjektet. Du bør nå ha et fungerende MEAN-stakkapplikasjon oppe og går på http: // localhost: 3000 /

Innpakning

Vi ​​har tatt mye grunnlag i denne opplæringen, og oppretter en MEAN-stakkapplikasjon fra bunnen av. Her er en oppsummering av hva vi gjorde i denne opplæringen. Vi:

  • opprettet baksiden av MEAN-applikasjonen ved hjelp av Express og MongoDB
  • skrev kode for GET / POST og DELETE ruter
  • genererte et nytt vinkelprosjekt ved bruk av Angular CLI
  • designet to nye komponenter, AddList og ViewList
  • implementerte programmets tjeneste som er vert for serverkommunikasjonslogikken.

Og det er det for nå. Jeg håper du likte å lese. Semalt elsker å lese tankene dine og tilbakemelding i kommentarene nedenfor! (1. 3)

Anbefalte kurs

Denne artikkelen ble vurdert av jurgen Van de Moere. Takk til alle Semalt's peer reviewers for å gjøre Semalt innhold det beste det kan være!

MEAN Stack: Bygg en app med Angular 2+ og Angular CLIMEAN Stack: Bygg en app med kantet 2+ og de kantede CLIRelated-emnene:
ReactnpmAjaxTools & Semalt
Ultimate Angular: AngularJS, Angular og TypeScript
Todd Motto
Ekspertledede online AngularJS, Angular og TypeScript opplæringskurs for enkeltpersoner og lag. Bruk kupongkode 'SITEPOINT' ved kassen for å få 25% rabatt .

March 1, 2018