Elm - Abonelikler
Önceki bölümde, bir Görünümün Komutları kullanarak diğer bileşenlerle etkileşime girdiğini tartışmıştık. Benzer şekilde, bir bileşen (Örn. WebSocket), Abonelikleri kullanarak bir Görünüm ile konuşabilir. Abonelikler, bir Elm uygulamasının klavye olayları, zamanlayıcı olayları ve WebSocket olayları gibi harici girdileri alabilmesinin bir yoludur.
Aşağıdaki şekil bir Elm uygulamasında Aboneliklerin rolünü açıklamaktadır. Kullanıcı, mesajlar aracılığıyla bir Elm uygulamasıyla etkileşime girer. Verilen uygulama WebSocket kullanır ve iki işlem moduna sahiptir -
- İstemci tarafı verilerini komut aracılığıyla soket sunucusuna gönderin
- Abonelik aracılığıyla soket sunucusundan istediğiniz zaman veri alın
Sözdizimi
Bir aboneliği tanımlamak için sözdizimi aşağıda verilmiştir -
type Sub msg
İllüstrasyon
Basit bir örnek kullanarak abonelikleri anlayalım.
Aşağıda verilen örnekte, uygulama sunucuya bir mesaj göndermektedir. Sunucu, istemciye aynı mesajla yanıt veren bir yankı sunucusudur. Tüm gelen mesajlar daha sonra bir listede görüntülenir. Sunucudan gelen mesajları sürekli dinleyebilmek için WebSocket (wss protokolü) kullanacağız. WebSocket, sunucudan mesaj almak için Aboneliği kullanırken Komutları kullanarak sunucuya kullanıcı girişi gönderir.
Uygulamanın çeşitli bileşenleri aşağıda verilmiştir -
Yankı sunucusu
Yankı sunucusuna wss protokolü kullanılarak erişilebilir. Yankı sunucusu, kullanıcı girişini uygulamaya geri gönderir. Bir yankı sunucusunu tanımlama kodu aşağıda verilmiştir -
echoServer : String
echoServer =
"wss://echo.websocket.org"
Modeli
Model, kullanıcı girişini ve soket sunucusundan gelen mesajların bir listesini temsil eder. Modeli tanımlama kodu aşağıda verilmiştir -
type alias Model =
{ input : String
, messages : List String
}
Mesajlar
Mesaj türü, kullanıcıdan metin girişi almak için Giriş içerir. Gönder mesajı, kullanıcı WebSocket sunucusuna mesaj göndermek için butona tıkladığında üretilecektir. NewMessage, mesaj yankı sunucusundan geldiğinde kullanılır.
type Msg
= Input String
| Send
| NewMessage String
Görünüm
Uygulamanın görünümü bir metin kutusu ve sunucuya kullanıcı girişi göndermek için bir gönderme düğmesi içerir. Sunucudan gelen yanıt, View'da bir div etiketi kullanılarak görüntülenir .
view : Model -> Html Msg
view model =
div []
[ input [onInput Input, value model.input] []
, button [onClick Send] [text "Send"]
, div [] (List.map viewMessage (List.reverse model.messages))
]
viewMessage : String -> Html msg
viewMessage msg =
div [] [ text msg ]
Güncelleme
Güncelleme işlevi mesajı ve model bileşenlerini alır. Modeli mesaj türüne göre günceller.
update : Msg -> Model -> (Model, Cmd Msg)
update msg {input, messages} =
case msg of
Input newInput ->
(Model newInput messages, Cmd.none)
Send ->
(Model "" messages, WebSocket.send echoServer input)
NewMessage str ->
(Model input (str :: messages), Cmd.none)
Sr. No. | Yöntem | İmza | Açıklama |
---|---|---|---|
1 | WebSocket.listen | listen: String -> (String -> msg) -> Alt mesaj | Bir web soketindeki herhangi bir gelen mesaja abone olur. |
2 | WebSocket.send | send: String -> String -> Cmd msg | Bir sunucu adresine wss isteği gönderir. Dinle ile bu adrese üye olmanız da önemlidir. Değilseniz, bir mesaj göndermek için web soketi oluşturulur ve ardından kapatılır. |
Abonelik
Abonelik işlevi model nesnesini alır. Mesajları WebSocket sunucusundan almak için mesajı NewMessage olarak ileten WebSocket.listen diyoruz . Sunucudan yeni bir mesaj geldiğinde güncelleme yöntemi çağrılır.
subscriptions : Model -> Sub Msg
subscriptions model =
WebSocket.listen echoServer NewMessage
ana
Ana işlev, aşağıda gösterildiği gibi karaağaç uygulamasına giriş noktasıdır.
main =
Html.program
{ init = init
, view = view
, update = update
, subscriptions = subscriptions
}
Hepsini bir araya koy
Step 1 - Bir dizin oluşturun, SubscriptionApp ve ona SubscriptionDemo.elm adlı bir dosya ekleyin.
Step 2 - Aşağıdaki içerikleri SubscriptionDemo.elm dosyasına ekleyin -
import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (..)
import WebSocket
main =
Html.program
{ init = init
, view = view
, update = update
, subscriptions = subscriptions
}
echoServer : String
echoServer =
"wss://echo.websocket.org"
-- MODEL
type alias Model =
{ input : String
, messages : List String
}
init : (Model, Cmd Msg)
init =
(Model "" [], Cmd.none)
-- UPDATE
type Msg
= Input String
| Send
| NewMessage String
update : Msg -> Model -> (Model, Cmd Msg)
update msg {input, messages} =
case msg of
Input newInput ->
(Model newInput messages, Cmd.none)
Send ->
(Model "" messages, WebSocket.send echoServer input)
NewMessage str ->
(Model input (str :: messages), Cmd.none)
-- SUBSCRIPTIONS
subscriptions : Model -> Sub Msg
subscriptions model =
WebSocket.listen echoServer NewMessage
-- VIEW
view : Model -> Html Msg
view model =
div []
[ input [onInput Input, value model.input] []
, button [onClick Send] [text "Send"]
, div [] (List.map viewMessage (List.reverse model.messages))
]
viewMessage : String -> Html msg
viewMessage msg =
div [] [ text msg ]
Step 3 - Elm paket yöneticisini kullanarak websockets paketini kurun.
C:\Users\dell\elm\SubscriptionApp> elm-package install elm-lang/websocket
Step 4 - Index.html dosyasını aşağıda gösterildiği gibi oluşturun ve oluşturun.
C:\Users\dell\elm\SubscriptionApp> elm make .\SubscriptionDemo.elm
Step 5 - Yürütme üzerine, aşağıdaki çıktı üretilecektir -