Ricerca…


introduzione

ccapndave / elm-update-extra è un fantastico pacchetto che ti aiuta a gestire funzioni di aggiornamento più complesse e può essere molto utile.

Messaggio che chiama un elenco di messaggi

Usando la funzione di sequence puoi facilmente descrivere un messaggio che chiama un elenco di altri messaggi. È utile quando si ha a che fare con la semantica dei messaggi.

Esempio 1: stai creando un motore di gioco e devi aggiornare lo schermo su ogni frame.

module Video exposing (..)
type Message = module Video exposing (..)

import Update.Extra exposing (sequence)

-- Model definition [...]

type Message
    = ClearBuffer
    | DrawToBuffer
    | UpdateLogic
    | Update

update : Message -> Model -> (Model, Cmd)
update msg model =
    case msg of
        ClearBuffer ->
            -- do something
        DrawToBuffer ->
            -- do something
        UpdateLogic ->
            -- do something
        Update ->
            model ! []
                |> sequence update [ ClearBuffer
                                   , DrawToBuffer
                                   , UpdateLogic]

Concatenare messaggi con andThen

La funzione andThen consente di aggiornare la composizione delle chiamate. Può essere utilizzato con l'operatore pipeline ( |> ) per gli aggiornamenti della catena.

Esempio: stai creando un editor di documenti e vuoi che ogni messaggio di modifica che hai inviato al documento, lo salvi anche:

import Update.Extra exposing (andThen)
import Update.Extra.Infix exposing (..)

-- type alias Model = [...]

type Message
    = ModifyDocumentWithSomeSettings
    | ModifyDocumentWithOtherSettings
    | SaveDocument

update : Model -> Message -> (Model, Cmd)
update model msg =
    case msg of
        ModifyDocumentWithSomeSettings ->
            -- make the modifications
            (modifiedModel, Cmd.none)
            |> andThen SaveDocument
        ModifyDocumentWithOtherSettings ->
            -- make other modifications
            (modifiedModel, Cmd.none)
            |> andThen SaveDocument
        SaveDocument ->
            -- save document code

Se Update.Extra.Infix exposing (..) anche Update.Extra.Infix exposing (..) potresti essere in grado di utilizzare l'operatore infisso:

update : Model -> Message -> (Model, Cmd)
update model msg =
    case msg of
        ModifyDocumentWithSomeSettings ->
            -- make the modifications
            (modifiedModel, Cmd.none)
            :> andThen SaveDocument
        ModifyDocumentWithOtherSettings ->
            -- make other modifications
            (modifiedModel, Cmd.none)
            :> SaveDocument
        SaveDocument ->
            -- save document code


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow