Elm - Komutlar
Önceki bölümlerde, Elm mimarisinin çeşitli bileşenlerini ve işlevlerini tartıştık. Kullanıcı ve uygulama, Mesajları kullanarak birbirleriyle iletişim kurar.
Uygulamanın, kullanıcı isteğine hizmet etmek için harici sunucu, API'ler, mikro hizmet vb. Gibi diğer bileşenlerle iletişim kurması gereken bir örnek düşünün. Bu, Elm'deki Komutlar kullanılarak gerçekleştirilebilir. Mesajlar ve komutlar eşanlamlı değildir. Mesajlar, bir son kullanıcı ile uygulama arasındaki iletişimi temsil ederken, komutlar bir Elm uygulamasının diğer varlıklarla nasıl iletişim kurduğunu temsil eder. Bir mesaja yanıt olarak bir komut tetiklenir.
Aşağıdaki şekil karmaşık bir Elm uygulamasının iş akışını göstermektedir -
Kullanıcı görünümle etkileşime girer. Görünüm, kullanıcının eylemine göre uygun bir mesaj oluşturur. Güncelleme bileşeni bu mesajı alır ve bir komutu tetikler.
Sözdizimi
Bir komutu tanımlamak için sözdizimi aşağıda verildiği gibidir -
type Cmd msg
View tarafından oluşturulan mesaj komuta iletilir.
İllüstrasyon
Aşağıdaki örnek bir API'ye istekte bulunur ve API'nin sonucunu görüntüler.
Uygulama, kullanıcıdan bir numara kabul eder, Numaralar API'sine iletir. Bu API, sayı ile ilgili gerçekleri döndürür.
Uygulamanın çeşitli bileşenleri aşağıdaki gibidir -
Http Modülü
Elm'in Http Modülü, HTTP istekleri oluşturmak ve göndermek için kullanılır. Bu modül, çekirdek modülün bir parçası değildir. Bu paketi kurmak için elm paket yöneticisini kullanacağız.
API
Bu örnekte, uygulama Numbers API ile iletişim kuracaktır - "http://numbersapi.com/#42".
Görünüm
Uygulamanın görünümü bir metin kutusu ve bir düğme içerir.
view : Model -> Html Msg
view model =
div []
[ h2 [] [text model.heading]
,input [onInput Input, value model.input] []
, button [ onClick ShowFacts ] [ text "show facts" ]
, br [] []
, h3 [][text model.factText]
]
Modeli
Model, kullanıcı tarafından girilen değeri ve API tarafından döndürülecek sonucu temsil eder.
type alias Model =
{ heading : String
, factText : String
, input :String
}
İleti
Uygulama aşağıdaki üç mesajı içerir -
- ShowFacts
- Input
- NewFactArrived
Show Facts butonuna tıklandıktan sonra ShowFacts mesajı güncelleme yöntemine aktarılır. Kullanıcı metin kutusuna bir değer yazdığında, Giriş mesajı güncelleme yöntemine aktarılır. Son olarak, Http sunucusu yanıtı alındığında, NewFactArrived mesajı güncellemeye geçilecektir.
type Msg
= ShowFacts
|Input String
| NewFactArrived (Result Http.Error String)
Güncelleme
Güncelleme yöntemi, modeli ve komut nesnelerini içeren bir demet döndürür. Kullanıcı Gerçekleri Göster düğmesini tıkladığında, Mesaj daha sonra NumbersAPI'yi çağıran güncellemeye geçirilir.
update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
case msg of
Input newInput ->
(Model "NumbersApi typing.." "" newInput ,Cmd.none)
ShowFacts ->
(model, getRadmonNumberFromAPI model.input)
NewFactArrived (Ok newFact) ->
(Model "DataArrived" newFact "", Cmd.none)
NewFactArrived (Err _) ->
(model, Cmd.none)
Yardımcı İşlev
Yardımcı işlev getRandomNumberFromAPI , NumbersAPI'yi çağırır ve kullanıcı tarafından girilen sayıyı ona iletir. API tarafından döndürülen sonuç, modeli güncellemek için kullanılır.
getRadmonNumberFromAPI : String->Cmd Msg
getRadmonNumberFromAPI newNo =
let
url =
"http://numbersapi.com/"++newNo
in
Http.send NewFactArrived (Http.getString url)
Sr. No. | Yöntem | İmza | Açıklama |
---|---|---|---|
1 | Http.getString | getString: String -> İstek Dizesi | Bir GET isteği oluşturun ve yanıt gövdesini bir String olarak yorumlayın. |
2 | Http.send | gönder: (Sonuç Hatası a -> msg) -> İstek a -> Cmd msg | Http isteği gönderin. |
ana
Bu, Elm projesinin giriş noktasıdır.
main =
Html.program
{ init = init
, view = view
, update = update
, subscriptions = subscriptions
}
Hepsini bir araya koy
Step 1 - CommandApp klasörü ve CommandDemo.elm dosyası oluşturun.
Step 2- Elm paketi install elm-lang / http komutunu kullanarak http modülünü kurun .
Step 2 - CommandDemo.elm içeriğini aşağıda gösterildiği gibi yazın -
import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (..)
import Http
main =
Html.program
{ init = init
, view = view
, update = update
, subscriptions = subscriptions
}
-- MODEL
type alias Model =
{ heading : String
, factText : String
, input :String
}
init : (Model, Cmd Msg)
init =
( Model "NumbersAPI" "NoFacts" "42"-- set model two fields
, Cmd.none -- not to invoke api initially
)
-- UPDATE
type Msg
= ShowFacts
|Input String
| NewFactArrived (Result Http.Error String)
update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
case msg of
Input newInput ->
(Model "NumbersApi typing.." "" newInput ,Cmd.none)
ShowFacts ->
(model, getRadmonNumberFromAPI model.input)
NewFactArrived (Ok newFact) ->
(Model "DataArrived" newFact "", Cmd.none)
NewFactArrived (Err _) ->
(model, Cmd.none)
- VIEW
view : Model -> Html Msg
view model =
div []
[ h2 [] [text model.heading]
,input [onInput Input, value model.input] []
, button [ onClick ShowFacts ] [ text "show facts" ]
, br [] []
, h3 [][text model.factText]
]
-- SUBSCRIPTIONS
subscriptions : Model -> Sub Msg
subscriptions model =
Sub.none
-- HTTP
getRadmonNumberFromAPI : String->Cmd Msg
getRadmonNumberFromAPI newNo =
let
url =
"http://numbersapi.com/"++newNo
in
Http.send NewFactArrived (Http.getString url)
Step 4 - Komutu çalıştır.
C:\Users\dell\elm\CommandApp> elm make .\CommandDemo.elm
Bu, aşağıda gösterildiği gibi html dosyasını oluşturacaktır.