En introduksjon til håndtakene

Hvis nettstedets data regelmessig endres, kan det hende du vil ta en titt på håndtakene. Håndtak er en malprosessor som dynamisk genererer HTML-siden din, og sparer deg tid fra å utføre manuelle oppdateringer. I denne opplæringen vil jeg introdusere deg til håndtak og lære deg hvordan du lager en grunnleggende mal for nettstedet ditt.


Nettstedskart

Det er to grunnleggende grunner til at du vil lage en mal for nettstedet ditt. Først av alt oppfordrer å bygge en mal at du skiller den logikkbaserte koden fra selve visningen, og hjelper deg å følge et visnings / kontrolleringsmønster. For det andre, maler holder koden ren og vedlikeholdbar, noe som igjen gjør prosessen med å oppdatere nettstedet ditt en bris. Du lager ikke et nettsted med styrer. I stedet lager du retningslinjer og strukturer som dikterer hvordan nettstedet skal se uten å fokusere på en side data. La oss dekke noen av grunnleggende.


Det grunnleggende

Håndtak genererer HTML-en din ved å ta en JSON-struktur og kjøre den gjennom en mal. Disse malene er skrevet hovedsakelig i vanlig HTML, og er peppered med plassholdere som lar deg injisere data etter behov. For eksempel hilser følgende mal brukeren når de logger på:

Velkommen tilbake, name

De Navn Attributt er hvor brukerens navn vil bli injisert på siden. Denne plassholderen tilsvarer en egenskap i datas JSON-struktur. Dette er det mest grunnleggende eksemplet, men du vil snart se at alt annet i utgangspunktet koker ned til dette enkle konseptet. La oss gå videre til håndteringsarrayer.

arrays

Håndtakene leveres med noen innebygde hjelpere for å hjelpe deg med å jobbe med mer komplekse data. En av disse hjelperne er Hver hjelper. Denne hjelperen iterates gjennom en matrise og lar deg lage dynamisk HTML, per array element. For eksempel viser følgende mall en datas data som inneholder en liste over de lokale konsertene som spilles i mitt område:

 #each konserter  /Hver 
Lokale konserter
dette

Som du kan se, er denne koden mye renere enn konvensjonell kode, for eksempel å bruke en loop i PHP eller JavaScript for å legge til HTML til en variabel. Håndtakene er ikke påtrengende, og det er det som gjør håndtakene så tilgjengelige. Du kan også merke at vi bruker attributtnavnet, dette, for å hente det nåværende arrayelementet i Hver sløyfe.

Dette eksempelet er bra for en rekke enkle verdier, men hvordan håndterer du mer komplekse data? Vel, du gjør det i det samme. For eksempel skal vi skrive en mal for følgende data:

[Navn: "Band", Dato: "14.aug.2012", Album: [Navn: "Generisk navn", Navn: "Noe annet!" ], Navn: "Andre gutter", Dato: "22. august 2012" Album: [Name: "Album One"]]

Vi kan enkelt vise denne informasjonen ved hjelp av følgende mal:

 #each Bands  /Hver 
Bandnavn Dato Albumnavn
Navn Dato Albums.0.Name

Du kan lagre malen din i en

For enkelhets skyld kan du lagre malen din i en

Hvis nettstedets data regelmessig endres, kan det hende du vil ta en titt på håndtakene.

Dette er den komplette koden for å samle og generere HTML-kode fra en mal. Du kan teknisk sett overføre JSON-dataene fra API-en direkte til håndterker, men du får problemer med kryss opprinnelse. I stedet for å utføre en slags hack eller ved hjelp av PHP for å "ekko" dataene til en JavaScript-variabel, bestemte jeg meg for å sette alt dette inn i en egen fil: Recipe.php. Så før vi begynner å bygge mal, la oss ta en titt på den PHP-filen.

Få dataene

Yummly API er ganske enkelt. Det er ingen utførlig autentiseringssystem; du må bare registrere deg, få noen legitimasjonsbeskrivelser, og sett dem inn i nettadressen. Du kan direkte ekko dataene hvis du vil, men jeg vil ha litt mer detaljert informasjon om hver oppskrift. Derfor behandler jeg dataene fra det første API-anropet og foretar en ny forespørsel for hver oppskrift. Her er det komplette PHP-skriptet:

fyrstikker; // syklus gjennom oppskrifter og få full oppskrift for hver foreach ($ oppskrifter som $ oppskrift) $ ID = $ oppskrift-> id; $ R = json_decode (file_get_contents ("http://api.yummly.com/v1/api/recipe/". $ ID. "? _App_id =". $ UserID. "& _App_key =". $ UserKey. "& Images = large ")); // Dette er dataene vi skal sende til vår mal array_push ($ Json, array (Name => $ R-> navn, Ingredients => $ R-> ingredientLines, Image => $ R-> bilder [0] -> hostedLargeUrl, Yield => $ R-> yield, Flavours => $ R-> smaker, Source => array (Name => $ R-> kilde-> sourceDisplayName, Url => $ R-> kilde-> sourceRecipeUrl )));  // Skriv ut det endelige JSON objektet echo json_encode ($ Json); ?>

Ved å bygge nettstedet ditt med en håndtaksmal, kan du produsere et fullsteds nettstedskode i bare noen få linjer. Her er hele malen:

La oss løpe gjennom denne koden. De første syv linjene er bare logoen øverst på siden. Deretter oppretter vi for hver oppskrift et oppskriftskort med et bilde, navn og ingredienser.

Yummly API returnerer en liste over smakdata (dvs. hvor søt, sur, krydret, etc ...) for hvert element. Jeg skrev en funksjonshjelp, kalt getFlavor som tar denne informasjonen og gir den mest dominerende smaken i parabolen. For at denne mal skal fungere, må vi laste inn i getFlavor Hjelper til håndtak før du analyserer malen. Så i begynnelsen av den andre skripteksjonen, legg til følgende kode før Ajax-koden:

Handlebars.registerHelper ("getFlavor", funksjon (FlavorsArr) var H = 0; varnavn = "; for (var F i FlavorsArr) if (FlavorsArr [F]> H) H = FlavorsArr [F]; Navn = F; returnere "Denne parabolen har en" + Navn + "smak";);

Nå, når håndtakene ser getFlavor, det kaller den tilknyttede funksjonen og henter smakinformasjonen.

På dette tidspunktet er du fri til å spille rundt og designe malen, men du vil mest sannsynlig se at denne prosessen er treg. Dette skyldes hovedsakelig de tre API-anropene før håndterker laster siden. Tydeligvis er dette ikke ideelt, men forkompilering av malen din kan hjelpe.


forkompilere

Du har to forskjellige alternativer, når det gjelder håndtak. Den første er å forkompilere selve malen. Dette reduserer belastningstiden, og du trenger ikke å inkludere håndterings-kompilatoren med siden din.

Dette resulterer også i en mindre filstørrelse, men dette hjelper ikke virkelig i vårt scenario.

Vårt problem er kommunikasjonen mellom nettleseren og API. Hvis du vil forkompilere malen din, kan du laste ned Node.js-pakken gjennom NPM med følgende kommando:

npm installere styrer -g

Du må kanskje gjøre dette som root (dvs. legg til 'sudo' før kommandoen). Når du er installert, kan du opprette en fil for malen din og kompilere den slik:

styrer demo.handlebars -f demo.js

Du bør gi din malfil a .styret forlengelse. Dette er ikke obligatorisk, men hvis du nevner det noe som demo.html, så vil malens navn være "demo.html" som bare "demo". Etter å ha navngitt malen, må du bare inkludere utdatafilen sammen med run-time-versjonen av håndtakene (du kan bruke den vanlige versjonen, men den er større) og skriv inn følgende:

var template = Handlebars.templates ['demo']; var html = mal (din json data her);

De med mindre erklæring er ... i hovedsak en invertert hvis uttalelse.

Men som jeg tidligere nevnte, hjelper det oss ikke virkelig med dette scenariet. Hva kan vi da gjøre? Vel, vi kan forkompilere og sende ut hele filen. Dette gjør det slik at vi kan kjøre malen med data og lagre den endelige HTML-utgangen - caching, med andre ord. Dette øker hastigheten på belastningstiden for søknaden din drastisk. Dessverre har JavaScript-klientens side ikke fil IO-evner. Så, den enkleste måten å oppnå dette på er å bare sende HTML til en tekstboks og lagre den manuelt. Vær oppmerksom på en APIs retningslinjer for caching. De fleste APIer har maksimalt tid at dataene kan lagres sørg for å finne den informasjonen før du lagrer statiske sider.


Konklusjon

Dette har vært en rask introduksjon til håndtakene. Fremover kan du se på "Deler" - små maler som kan brukes som funksjoner. Som alltid, vær så snill å legge igjen en kommentar eller et spørsmål i kommentarseksjonen nedenfor.