CRUD – Create, Read, Update, Delete – de fire hellige gral af databasehandlinger. De er de eneste ting, du nogensinde får brug for for at gøre noget væsentligt med din database. Selvfølgelig kan du øge kompleksiteten af forespørgslerne, men i sidste ende koger det hele ned til disse fire handlinger.
Firebase er et Google-ejet cloud-baseret system, der leveres komplet med API-kroge, filopbevaringsplads, auth-system og hostingfunktioner. Det er et meget undervurderet system, der bør udnyttes mere til prototyping og hurtig applikationsudvikling.
Hvis du ønsker at starte en progressiv webapp op, men ikke har backend-erfaring med opsætning af servere, oprettelse af API’er og håndtering af databaser, så er Firebase en fantastisk mulighed for frontend-udviklere, der måske føler sig isoleret og fastlåst af den massive bakke af oplysninger, de skal behandle for overhovedet at få deres app op at køre.
Og hvis du bare mangler tid, kan Firebase reducere dine udviklingstimer næsten til det halve, så du kan fokusere på brugeroplevelsen og implementere disse UI-flows. Det er også fleksibelt nok til at migrere din frontend-applikation ud og bruge en anden database, hvis det er nødvendigt.
Her er en hurtig vejledning om, hvordan du implementerer CRUD-handlinger med Angular og Firebase.
Det er en bare bones kaffebestillingsapp, hvor du kan tilføje ordrer (oprette), liste ordrer fra databasen (læse), markere ordren som afsluttet (opdatere) og fjerne en ordre (slette).
Sigtet med denne vejledning er at hjælpe dig med at komme i gang med Firebase Firestore og se, hvor nemt det er at oprette forbindelse til og komme i gang med den Google-ejede tjeneste. Dette er ikke en reklame for Google (jeg får ingen kickbacks fra dem for dette), men blot en illustration af, hvordan Angular spiller sammen med databasen.
Den app, vi skal lave, er ikke perfekt. Der mangler ting som datavalidering og en million mulige funktioner, som jeg også kan tilføje. Men det er ikke det, det drejer sig om. Pointen er at sætte op i Angular så hurtigt som muligt og få den til at fungere med en levende database.
Så, nok af introen – her er koden walk through.
Den indledende opsætning
Sæt din Angular-app op via Angular CLI’en. Hvis du ikke allerede har Angular CLI, kan du læse mere om det her.
Kort sagt skal du blot køre disse kommandoer i din terminal i den mappe, hvor du vil have din Angular-app til at ligge. Her er kommandoerne, og hvad de gør.
npm install -g @angular/cli
Installerer Angular CLI i din terminal, hvis du ikke allerede har det.
ng new name-of-app-here
Dette vil oprette et nyt Angular-projekt med den nyeste version af Angular, der er tilgængelig.
cd name-of-app-here
Når du opretter et nyt projekt via Angular CLI, vil den oprette en ny projektmappe for dig. cd
vil føre dig ind i denne mappe via terminalen.
ng serve
Dette er vil starte og køre dit Angular-projekt.
Opsætning af Angular
Vi vil oprette 3 nye dele i alt til denne Angular-app – ordrer, ordre-liste og shared/ordersService. De to første er komponenter, der vil indeholde grænsefladen til appen og shared/orders service, som vil holde alle Firebase API-opkald samlet.
For at oprette de nødvendige filer skal du køre følgende kommandoer:
ng g c orders
ng g c orders
g
står for generate og c
står for component. Den sidste del af kommandoen er navnet på din fil, som i ovenstående tilfælde hedder orders. Du kan også bruge ng generate component orders
for at opnå samme effekt.
Opret en anden komponent til order-list ved hjælp af følgende kommando:
ng g c order-list
Og endelig skal du for tjenesten bruge s
i stedet for c
som nedenfor:
ng g s shared/orders
Dette vil oprette en orders.service.ts
-fil i en mappe med navnet shared. Sørg for at tilføje orders.service.ts
i app.module.ts
, da dette ikke gøres automatisk for dig, som det er tilfældet med komponenterne. Du kan gøre dette via import
og tilføje det til providers
-listen på følgende måde:
import { OrdersService } from "./shared/orders.service";
...
providers:
...
CSS
I denne vejledning vil vi bruge Materialize CSS til at få vores endelige applikation til at se bedre ud end standard-css’en. Det er ikke nødvendigt, og du kan bruge hvilken som helst CSS-ramme eller din egen brugerdefinerede CSS, hvis du vil. Du kan se detaljerne om Materialize CSS her.
Vi vil også bruge Googles materialeikoner som knapper til at markere kaffebestillingen som afsluttet eller slette bestillingen.
En måde at implementere dette på er at have nedenstående kode lige over </head>
-tagget i din index.html
-fil, der ligger i src
-mappen.
<!-- Compiled and minified Materialize CSS -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">
<!-- Compiled and minified Materialize JavaScript -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script><!-- Google Material Icons -->
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet" />
Den indledende Angular view-kode
I app.component.html
skal du slette al startkoden. Vi skal bruge vores eget indhold til dette.
Vi kobler os på den komponent, vi lige har oprettet, og viser dem på skærmen ved hjælp af selektorerne app-orders
og app-order-list
. For at gøre dette skriver vi nedenstående kode:
<div class="container">
<div class="row">
<app-orders class="col s6"></app-orders>
<app-order-list class="col s6"></app-order-list>
</div>
</div>
Klasserne container
, row
, col
og s6
er en del af Materialize CSS-gittersystemet. Alle klasser, som du vil se i resten af denne vejledning, er fra Materialize CSS, medmindre andet er nævnt.
Opsætning af formular
For at opsætte formularer skal du importere ReactiveFormsModule
i app.module.ts
og huske at importere den i imports
-arrayet.
import { ReactiveFormsModule } from "@angular/forms";
Ind i orders.service.ts
importer FormControl
og FormGroup
fra @angular/forms
og opret en ny formular uden for constructor
, hvor du kan indstille formularens egenskaber som nedenfor:
import { FormControl, FormGroup } from "@angular/forms";
...
...export class OrdersService {
constructor() {}
form = new FormGroup({
customerName: new FormControl(''),
orderNumber: new FormControl(''),
coffeeOrder: new FormControl(''),
completed: new FormControl(false)
})
}
Vi skal bruge disse værdier til at gemme i Firebase lidt senere i denne tutorial.
Brug formularen inde i en komponent
import
OrdersService
-klassen i din komponent, så du kan bruge objektet inde i din komponent og derefter oprette et objekt af klassen inde i constructor
.
import { OrdersService } from "../shared/orders.service";
...
constructor(private ordersService:OrdersService){}
Inde i din orders.component.html
skal du bruge formGroup
-direktivet til at referere til det formularobjekt, der er oprettet i OrdersService
. Hver formControlName
refererer til de navne, som vi har brugt i formGroup
, der er oprettet inde i OrdersService
-klassen. Dette vil gøre det muligt for den tilknyttede controller at bruge de variabler, der er indtastet i formularen. Se koden nedenfor:
<form ="this.ordersService.form">
<input placeholder="Order Number"
formControlName="orderNumber"
type="text"
class="input-field col s12">
<input placeholder="Customer Name"
formControlName="customerName"
type="text"
class="input-field col s12">
</form>
I orders.component.ts
skal vi oprette et array af kaffe til at løbe igennem på vores orders.component.html
. I teorien kunne du også opsætte dette inde i din Firestore-database, lave et kald til samlingen og derefter bruge den. Men af hensyn til længden vil vi opsætte det som et lokalt array. Inde i din OrdersComponent
-klasse opstiller du følgende array:
coffees = ;
I din orders.component.html
og inde i dine <form>
-tags løber du gennem det ved hjælp af *ngFor
med en (click)
action handler for at tilføje nye kaffer til din bestilling. Vi vil vise bestillingslisten lige nedenfor med mulighed for at fjerne den enkelte kaffe som følger:
<button class="waves-effect waves-light btn col s4"
*ngFor="let coffee of coffees"
(click)="addCoffee(coffee)">
{{coffee}}
</button><ul class="collection">
<li *ngFor="let coffee of coffeeOrder">
<span class="col s11"> {{ coffee }} </span>
<a class="col s1" (click)="removeCoffee(coffee)">x</a>
</li>
</ul>
Inden for orders.component
opretter du et tomt array til at rumme kaffebestillingen, bruger funktionen addCoffee()
til at tilføje nye kaffer og removeCoffee()
til at fjerne en drik fra din bestillingsliste.
coffeeOrder = ;addCoffee = coffee => this.coffeeOrder.push(coffee);removeCoffee = coffee => {
let index = this.coffeeOrder.indexOf(coffee);
if (index > -1) this.coffeeOrder.splice(index, 1);
};
Håndtering af formularindsendelse
Føj et input Submit Order ind i og i bunden af <form>
-tags og tilføj onSubmit()
til en klikhåndtering som nedenfor:
<form ="this.ordersService.form" (ngSubmit)="onSubmit()"> ...
<button
class="waves-effect waves-light btn col s12"
(click)="onSubmit()">
Submit
</button>
</form>
Opret en tom onSubmit
funktion i din orders.component
til den mellemliggende onSubmit
funktion. Vi vil snart tilføje hændelseshåndtering til den. På dette tidspunkt bør din formular være klar til at blive koblet op til din Firebase-database.
Opsætning af listekomponenten
Nu mangler vi bare et sted at vise vores kaffebestillinger fra databasen. Indtil videre vil vi bare opsætte stilladset html.
Navigér til din order-list.component.html
og opret en tabel med 3 overskrifter og 5 dataceller. De første 3 dataceller vil indeholde de værdier, der trækkes fra databasen, og de sidste 2 vil indeholde ekstra funktionalitet, der giver dig mulighed for at markere ordren som fuldført eller slette ordren.
Indstilling af Firebase
Gå til din Firebase-konsol, og tilføj et nyt projekt.
Føj et projektnavn til, accepter vilkårene og betingelserne, og klik på opret projekt.
Når dit Firebase-projekt er oprettet, vil du se noget, der ligner dette.
Opret en database ved at vælge Database på sidepanelet (placeret under Develop) og klik derefter på Create Database under Cloud Firestore-banneret.
Vælg start i testtilstand for sikkerhedsregler. Du kan ændre det senere.
Du vil få en tom Firestore-database som denne.
Forbindelse af Firebase Firestore til Angular
For at forbinde din Angular-app til Firebase skal du installere firebase
og @angular/fire
-pakker. Dette vil give dig adgang til AngularFireModule
og AngularFirestoreModule
. Brug følgende kommando i din terminal til at installere dem.
npm i --save firebase @angular/fire
Implementering af konnektorer
Gå tilbage til din Firebase-webkonsol, og hent konfigurationsoplysningerne til brug i din Angular-app. Dette er placeret på din projektoversigtsside. Den ser nogenlunde sådan ud: