,0.00' price

Käytämme format -toiminto tästä numeropaketista. Tämä muotoilisi numerot tavalliseen tapaan valuutat:

100.5 -> 0.50 15.36 -> .36 21.15 -> .15

Automaattinen dokumentaation luonti

Kun julkaiset paketin Elm-arkistoon, dokumentaatio luodaan automaattisesti koodin kommenttien perusteella. Voit nähdä sen toiminnassa tutustumalla Cart-moduulin dokumentaatioon tässä . Kaikki nämä on luotu tässä tiedostossa olevista kommenteista: Cart.elm .

Todellinen virheenkorjaus käyttöliittymään

Kääntäjä itse havaitsee ja ilmoittaa ilmeisimmät ongelmat. Mikään sovellus ei kuitenkaan ole suojattu loogisilta virheiltä.

Koska kaikki Elmin tiedot ovat muuttumattomia ja kaikki tapahtuu päivitystoiminnolle välitettyjen viestien kautta, Elm-ohjelman koko virta voidaan esittää sarjana mallimuutoksia. Debuggerille Elm on kuin vuoropohjainen strategiapeli. Tämän avulla virheenkorjaaja voi suorittaa todella upeita tekoja, kuten matkustaa ajan myötä. Se voi liikkua edestakaisin ohjelmassa läpi siirtymällä eri mallimuutosten välillä, jotka tapahtuivat ohjelman elinkaaren aikana.

Voit oppia lisää virheenkorjauksesta tässä .

Vuorovaikutus Back-endin kanssa

Joten sanotte, että olemme rakentaneet mukavan lelun, mutta voiko Hammasta käyttää johonkin vakavaan? Ehdottomasti.

Yhdistetään ostoskorin käyttöliittymä asynkroniseen käyttöliittymään. Jotta se olisi mielenkiintoinen, toteutamme jotain erityistä. Oletetaan, että haluamme tarkastaa kaikki kärryt ja niiden sisällön reaaliajassa. Todellisessa elämässä voisimme käyttää tätä lähestymistapaa tuodaksemme ylimääräisiä markkinointi- / myyntimahdollisuuksia verkkokauppaan tai markkinapaikkaan, tai tehdä joitakin ehdotuksia käyttäjälle tai arvioida tarvittavat varastoresurssit ja paljon muuta.

Joten varastamme ostoskorin asiakaspuolelle ja ilmoitamme palvelimelle myös jokaisesta ostoskorista reaaliajassa.

Jotta asiat pysyisivät yksinkertaisina, toteutamme taustamme käyttämällä Pythonia. Löydät taustakoodin koko koodin tässä .

Se on yksinkertainen verkkopalvelin, joka käyttää WebSocketia ja seuraa ostoskorin sisältöä muistissa. Yksinkertaisuuden vuoksi renderöimme kaikkien muiden ostoskorin samalla sivulla. Tämä voidaan helposti toteuttaa erillisellä sivulla tai jopa erillisenä Elm-ohjelmana. Toistaiseksi jokainen käyttäjä voi nähdä yhteenvedon muiden käyttäjien ostoskorista.

Kun käyttöliittymä on paikallaan, meidän on nyt päivitettävä Elm-sovelluksemme lähettääksesi ja vastaanottaaksesi ostoskoripäivityksiä palvelimelle. Käytämme JSONia koodaamaan hyötykuormamme, jota Elmillä on erinomainen tuki.

CartEncoder.elm

Toteutamme kooderin muuntamaan Elm-tietomallimme JSON-merkkijonoesitykseksi. Tätä varten meidän on käytettävä Json. Koodaa kirjasto .

module CartEncoder exposing (cart) import Cart2 exposing (Cart, Item, Product) import List exposing (map) import Json.Encode exposing (..) product : Product -> Value product product = object [ ('name', string product.name) , ('price', float product.price) ] item : Item -> Value item item = object [ ('product', product item.product) , ('qty', int item.qty) ] cart : Cart -> Value cart cart = list (map item cart)

Kirjasto tarjoaa joitain toimintoja (kuten string, int, float, object jne.), Jotka ottavat Elm-objektit ja tekevät niistä JSON-koodatut merkkijonot.

CartDecoder.elm

Dekooderin käyttöönotto on hieman hankalampi, koska kaikilla Elm-tiedoilla on tyyppejä, ja meidän on määriteltävä, mikä JSON-arvo on muunnettava mihin tyyppiin:

module CartDecoder exposing (cart) import Cart2 exposing (Cart, Item, Product) -- decoding for Cart import Json.Decode exposing (..) -- will decode cart from string cart : Decoder (Cart) cart = list item -- decoder for cart is a list of items item : Decoder (Item) item = object2 Item -- decoder for item is an object with two properties: ('product' := product) -- 1) 'product' of product ('qty' := int) -- 2) 'qty' of int product : Decoder (Product) product = object2 Product -- decoder for product also an object with two properties: ('name' := string) -- 1) 'name' ('price' := float) -- 2) 'price'

Päivitetty Elm-sovellus

Koska lopullinen Elm-koodi on vähän pidempi, löydät sen tässä . Tässä on yhteenveto käyttöliittymäsovellukseen tehdyistä muutoksista:

Olemme käärineet alkuperäisen update toiminto toiminnolla, joka lähettää muutoksia ostoskorin sisältöön taustapuolelle joka kerta kun ostoskoria päivitetään:

updateOnServer msg model = let (newModel, have_to_send) = update msg model in case have_to_send of True -> -- send updated cart to server (!) newModel [ WebSocket.send server (encode 0 (CartEncoder.cart newModel.cart)) ] False -> -- do nothing (newModel, Cmd.none)

Olemme myös lisänneet ylimääräisen viestityypin ConsumerCarts String saada päivityksiä palvelimelta ja päivittää paikallinen malli vastaavasti.

Näkymä on päivitetty muokkaamaan muiden kärryjen yhteenveto consumersCartsView -painikkeella toiminto.

WebSocket-yhteys on muodostettu tilaamaan taustakuva kuuntelemaan muiden kärryjen muutoksia.

subscriptions : Model -> Sub Msg subscriptions model = WebSocket.listen server ConsumerCarts server = 'ws://127.0.0.1:8765'

Olemme myös päivittäneet päätoimintomme. Käytämme nyt Html.program ylimääräisellä init ja subscriptions parametrit. init määrittää ohjelman alkuperäisen mallin ja subscription määrittää luettelon tilauksista.

Tilaus on tapa, jolla voimme käskeä Elmiä kuuntelemaan muutoksia tietyillä kanavilla ja välittämään nämä viestit update toiminto.

main = Html.program { init = init , view = view , update = updateOnServer , subscriptions = subscriptions } init = ( Model [] -- empty cart [ Product 'Bicycle' 100.50 -- stock , Product 'Rocket' 15.36 , Product 'Bisquit' 21.15 ] Nothing -- error (no error at beginning) [] -- consumer carts list is empty , Cmd.none)

Lopuksi olemme käsitelleet tapaa, jolla puramme ConsumerCarts-viestin, jonka saamme palvelimelta. Tämä varmistaa, että ulkoisesta lähteestä saamamme tiedot eivät riko sovellusta.

ConsumerCarts message -> case decodeString (Json.Decode.list CartDecoder.cart) message of Ok carts -> ( consumer_carts = carts , False) Err msg -> ( model , False)

Pidä etupäät terveenä

Elm on erilainen. Se vaatii kehittäjää ajattelemaan toisin.

Jokainen, joka tulee JavaScriptiä ja vastaavia kieliä edustavalle alueelle, yrittää oppia Elmin tapaa tehdä asioita.

Viime kädessä Elm tarjoaa kuitenkin jotain, mitä muut kehykset - jopa suosituimmat - usein taistelevat. Nimittäin se tarjoaa keinon rakentaa vankkoja käyttöliittymäsovelluksia sotkeutumatta valtavaan yksityiskohtaiseen koodiin.

Elm myös abstraktio monista JavaScriptin aiheuttamia vaikeuksia yhdistämällä älykäs kääntäjä tehokkaaseen virheenkorjaimeen.

Elm on sitä mitä etupään kehittäjät ovat kaipanneet niin kauan. Nyt kun olet nähnyt sen toiminnassa, ota se itse pyörimään ja nauti eduista rakentamalla seuraava web-projekti kaupungissa Elm.