本頁包含 Elm 0.18

訂閱(Subscriptions)

Elm 中,使用訂閱來監聽外部輸入。例如:

讓我們建置一個應用程式來描繪如何回應鍵盤及滑鼠事件。

首先,安裝必要函式庫

elm package install elm-lang/mouse
elm package install elm-lang/keyboard

接著建立程式

module Main exposing (..)

import Html exposing (Html, div, text, program)
import Mouse
import Keyboard


-- MODEL


type alias Model =
    Int


init : ( Model, Cmd Msg )
init =
    ( 0, Cmd.none )



-- MESSAGES


type Msg
    = MouseMsg Mouse.Position
    | KeyMsg Keyboard.KeyCode



-- VIEW


view : Model -> Html Msg
view model =
    div []
        [ text (toString model) ]



-- UPDATE


update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
    case msg of
        MouseMsg position ->
            ( model + 1, Cmd.none )

        KeyMsg code ->
            ( model + 2, Cmd.none )



-- SUBSCRIPTIONS


subscriptions : Model -> Sub Msg
subscriptions model =
    Sub.batch
        [ Mouse.clicks MouseMsg
        , Keyboard.downs KeyMsg
        ]



-- MAIN


main : Program Never Model Msg
main =
    program
        { init = init
        , view = view
        , update = update
        , subscriptions = subscriptions
        }

使用 Elm reactor 執行此程式,每當你按下滑鼠,計數器會加壹,每當你按下鍵盤按鍵,計數器會加貳。


回顧這程式的重要部份,與訂閱有關。

訊息

type Msg
    = MouseMsg Mouse.Position
    | KeyMsg Keyboard.KeyCode

兩個合適的訊息 MouseMsgKeyMsg。當按下滑鼠或鍵盤時觸發。

更新

update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
    case msg of
        MouseMsg position ->
            ( model + 1, Cmd.none )

        KeyMsg code ->
            ( model + 2, Cmd.none )

對於各訊息,更新程式的反應不同,當按下滑鼠計數器加壹,按下鍵盤計數器加貳。

訂閱

subscriptions : Model -> Sub Msg
subscriptions model =
    Sub.batch ➌
        [ Mouse.clicks MouseMsg ➊
        , Keyboard.downs KeyMsg ➋
        ]

這裡宣告希望監聽的事件。監聽 Mouse.clicks ➊ 以及 Keyboard.presses ➋。兩者函式都是接受訊息建構子(message constructor)傳回訂閱。

使用 Sub.batch ➌ 同時監聽兩個事件。Batch 接受訂閱串列,傳回壹個訂閱,包含所有的訂閱。

results matching ""

    No results matching ""