This page covers Elm 0.18

서브스크립션

Elm 에서는 subscriptions 을 사용하여 외부 입력에 대응합니다. 예:

이해를 위해 키보드와 마우스 이벤트에 반응하는 어플리케이션을 만들어 봅시다.

우선 이 라이브러리들을 설치해야 합니다:

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 로 프로그램을 돌려봅니다. 마우스를 클릭할 때마다 1 씩, 키보드를 누를 때마다 2 씩 증가하는 카운터를 보실 수 있습니다.


서브스크립션과 관련된 부분을 다시 살펴 봅시다.

메시지

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 )

update 함수에서는 메시지별로 각각 처리를 합니다. 마우스를 누를 때는 1 씩, 키보드를 누를 때는 2 씩 증가하도록 쓰여진 것을 볼 수 있습니다.

서브스크립션

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

여기서는 참조하고 싶은 것들을 명시합니다. 우리가 필요한 건 Mouse.clicks ➊ 과 Keyboard.downs ➋ 입니다. 이 함수들은 메시지 생성자를 인자로 받고, 서브스크립션 타입을 돌려줍니다.

두 이벤트를 참조해야 하므로 Sub.batch ➌ 를 사용합니다. batch 는 서브스크립션의 리스트를 받아 모두를 포함하는 하나의 서브스크립션을 리턴합니다.

results matching ""

    No results matching ""