Elm - Comandos

Nos capítulos anteriores, discutimos os vários componentes da arquitetura do Elm e suas funções. O usuário e o aplicativo se comunicam por meio de mensagens.

Considere um exemplo, em que o aplicativo precisa se comunicar com outros componentes, como um servidor externo, APIs, microsserviços, etc. para atender à solicitação do usuário. Isso pode ser feito usando os comandos do Elm. Mensagens e comandos não são sinônimos. As mensagens representam a comunicação entre um usuário final e o aplicativo, enquanto os comandos representam como um aplicativo Elm se comunica com outras entidades. Um comando é disparado em resposta a uma mensagem.

A figura a seguir mostra o fluxo de trabalho de um aplicativo Elm complexo -

O usuário interage com a visualização. A visualização gera uma mensagem apropriada com base na ação do usuário. O componente de atualização recebe essa mensagem e dispara um comando.

Sintaxe

A sintaxe para definir um comando é a seguinte -

type Cmd msg

A mensagem gerada pela visualização é passada para o comando.

Ilustração

O exemplo a seguir faz uma solicitação a uma API e exibe o resultado da API.

O aplicativo aceita um número do usuário e o passa para a API do Numbers. Esta API retorna fatos relacionados ao número.

Os vários componentes do aplicativo são os seguintes -

Módulo Http

O Módulo Http do Elm é usado para criar e enviar solicitações HTTP. Este módulo não faz parte do módulo principal. Usaremos o gerenciador de pacotes elm para instalar este pacote.

API

Neste exemplo, o aplicativo se comunicará com a API do Numbers - "http://numbersapi.com/#42"

Visão

A visualização do aplicativo contém uma caixa de texto e um botão.

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

O modelo representa o valor inserido pelo usuário e o resultado que será retornado pela API.

type alias Model =
   { heading : String
   , factText : String
   , input :String
   }

mensagem

O aplicativo possui as três mensagens a seguir -

  • ShowFacts
  • Input
  • NewFactArrived

Ao clicar no botão Show Facts , a mensagem ShowFacts é passada para o método de atualização. Quando o usuário digita algum valor na caixa de texto, a mensagem de entrada é passada para o método de atualização. Finalmente, quando a resposta do servidor Http for recebida, a mensagem NewFactArrived será passada para atualização.

type Msg
   = ShowFacts
   |Input String
   | NewFactArrived (Result Http.Error String)

Atualizar

O método de atualização retorna uma tupla, que contém o modelo e os objetos de comando. Quando o usuário clica no botão Mostrar fatos, a mensagem é passada para a atualização que então chama o 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)

Função auxiliar

A função auxiliar getRandomNumberFromAPI invoca o NumbersAPI e passa para ele o número inserido pelo usuário. O resultado retornado pela API é usado para atualizar o modelo.

getRadmonNumberFromAPI : String->Cmd Msg
getRadmonNumberFromAPI newNo =
   let
      url =
         "http://numbersapi.com/"++newNo
   in
      Http.send NewFactArrived (Http.getString url)
Sr. Não. Método Assinatura Descrição
1 Http.getString getString: String -> Solicitar String Crie uma solicitação GET e interprete o corpo da resposta como uma String.
2 Http.send enviar: (Resultado do erro a -> msg) -> Solicitar uma -> Cmd msg Envie uma solicitação Http.

a Principal

Este é o ponto de entrada do projeto Elm.

main =
   Html.program
      { init = init
      , view = view
      , update = update
      , subscriptions = subscriptions
      }

Juntando tudo

Step 1 - Crie a pasta CommandApp e o arquivo CommandDemo.elm.

Step 2- Instale o módulo http usando o comando elm package install elm-lang / http .

Step 2 - Digite o conteúdo de CommandDemo.elm conforme mostrado abaixo -

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 - Dispare o comando.

C:\Users\dell\elm\CommandApp> elm make .\CommandDemo.elm

Isso irá gerar o arquivo html conforme mostrado abaixo.