Elm - Comandos
En los capítulos anteriores, discutimos los diversos componentes de la arquitectura Elm y sus funciones. El usuario y la aplicación se comunican entre sí mediante Mensajes.
Considere un ejemplo, donde la aplicación necesita comunicarse con otros componentes como un servidor externo, API, microservicio, etc. para atender la solicitud del usuario. Esto se puede lograr usando Comandos en Elm. Los mensajes y los comandos no son sinónimos. Los mensajes representan la comunicación entre un usuario final y la aplicación, mientras que los comandos representan cómo una aplicación de Elm se comunica con otras entidades. Se activa un comando en respuesta a un mensaje.
La siguiente figura muestra el flujo de trabajo de una aplicación Elm compleja:
El usuario interactúa con la vista. La vista genera un mensaje apropiado basado en la acción del usuario. El componente de actualización recibe este mensaje y activa un comando.
Sintaxis
La sintaxis para definir un comando es la siguiente:
type Cmd msg
El mensaje generado por la vista se pasa al comando.
Ilustración
El siguiente ejemplo realiza una solicitud a una API y muestra el resultado de la API.
La aplicación acepta un número del usuario y lo pasa a la API de Numbers. Esta API devuelve hechos relacionados con el número.
Los diversos componentes de la aplicación son los siguientes:
Módulo Http
El módulo Http de Elm se utiliza para crear y enviar solicitudes HTTP. Este módulo no es parte del módulo principal. Usaremos el administrador de paquetes elm para instalar este paquete.
API
En este ejemplo, la aplicación se comunicará con la API de Numbers - "http://numbersapi.com/#42".
Ver
La vista de la aplicación contiene un cuadro de texto y un botón.
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]
]
Modelo
El modelo representa el valor ingresado por el usuario y el resultado que será devuelto por la API.
type alias Model =
{ heading : String
, factText : String
, input :String
}
Mensaje
La aplicación tiene los siguientes tres mensajes:
- ShowFacts
- Input
- NewFactArrived
Al hacer clic en el botón Show Facts , el mensaje ShowFacts se pasa al método de actualización. Cuando el usuario escribe algún valor en el cuadro de texto, el mensaje de entrada se pasa al método de actualización. Finalmente, cuando se reciba la respuesta del servidor Http, el mensaje NewFactArrived se pasará a actualizar.
type Msg
= ShowFacts
|Input String
| NewFactArrived (Result Http.Error String)
Actualizar
El método de actualización devuelve una tupla, que contiene el modelo y los objetos de comando. Cuando el usuario hace clic en el botón Mostrar datos, el mensaje se pasa a la actualización que luego llama a NumbersAPI.
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)
Función auxiliar
La función auxiliar getRandomNumberFromAPI invoca la NumbersAPI y le pasa el número ingresado por el usuario. El resultado devuelto por la API se utiliza para actualizar el modelo.
getRadmonNumberFromAPI : String->Cmd Msg
getRadmonNumberFromAPI newNo =
let
url =
"http://numbersapi.com/"++newNo
in
Http.send NewFactArrived (Http.getString url)
No Señor. | Método | Firma | Descripción |
---|---|---|---|
1 | Http.getString | getString: String -> Request String | Cree una solicitud GET e interprete el cuerpo de la respuesta como una cadena. |
2 | Http.send | enviar: (Error de resultado a -> msg) -> Solicitar a -> Cmd msg | Envíe una solicitud Http. |
principal
Este es el punto de entrada del proyecto Elm.
main =
Html.program
{ init = init
, view = view
, update = update
, subscriptions = subscriptions
}
Poniendolo todo junto
Step 1 - Cree la carpeta CommandApp y el archivo CommandDemo.elm.
Step 2- Instale el módulo http usando el comando elm package install elm-lang / http .
Step 2 - Escriba el contenido de CommandDemo.elm como se muestra a continuació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 - Dispara el comando.
C:\Users\dell\elm\CommandApp> elm make .\CommandDemo.elm
Esto generará el archivo html como se muestra a continuación.