2015-11-22 17 views
9

में स्लाइडर को कैसे कार्यान्वित करें मैं एक स्लाइडर और इनपुट टेक्स्ट क्षेत्र को लिंक करना चाहता हूं जैसे कि जब मैं एक बदलता हूं तो दूसरा स्वचालित रूप से अपडेट हो जाता है। मुझे एल्म-रिएक्टर का कार्यान्वयन मिला, जो देशी जावास्क्रिप्ट का उपयोग करता है और कॉलबैक के साथ काम करता है। जब भी स्लाइडर स्थानांतरित हो जाता है तो कॉलबैक को कॉल किया जाता है लेकिन जब टेक्स्ट टेक्स्ट से मूल्य बदल जाता है तो मुझे इसे स्थानांतरित नहीं किया जा सकता है ...एल्म

उत्तर

16

वास्तव में यह मुश्किल नहीं है। यह कोड दिखाता है कि दो इनपुट प्रकारों का मान कैसे सेट करें।

import Html exposing (div, text, input) 
import Html.Attributes as H exposing (..) 
import Html.Events as E 

mbox = 
    Signal.mailbox "0" 

view v = 
    let 
    evth = E.on "change" E.targetValue (Signal.message mbox.address) 
    in 
    div [] 
    [ input 
     [ type' "range" 
     , H.min "0" 
     , H.max "20" 
     , value v 
     , evth 
     ] [] 
    , input 
     [ type' "text", value v, evth ] [] 
    ] 


main = 
    Signal.map view mbox.signal 

के लिए अद्यतन 0,17

import Html exposing (Attribute, div, text, input) 
import Html.App as Html 
import Html.Attributes as H exposing (..) 
import Html.Events exposing (on, onInput) 
import Json.Decode exposing (string, map) 
import String 

type alias Model = Int 

type Msg 
    = Update String 

update : Msg -> Model -> Model 
update (Update v) model = 
    String.toInt v |> Result.withDefault 0 

view model = 
    div [] 
    [ input 
     [ type' "range" 
     , H.min "0" 
     , H.max "20" 
     , value <| toString model 
     , onInput Update 
     ] [] 
    , text <| toString model 
    ] 

main = 
    Html.beginnerProgram 
    { model = 0 
    , view = view 
    , update = update 
    } 

के लिए 0,18

import Html exposing (Attribute, div, text, input) 
import Html.Attributes as H exposing (..) 
import Html.Events exposing (on, onInput) 
import Json.Decode exposing (string, map) 
import String 

type alias Model = Int 

type Msg 
    = Update String 

update : Msg -> Model -> Model 
update (Update v) model = 
    String.toInt v |> Result.withDefault 0 

view model = 
    div [] 
    [ input 
     [ type_ "range" 
     , H.min "0" 
     , H.max "20" 
     , value <| toString model 
     , onInput Update 
     ] [] 
    , text <| toString model 
    ] 

main = 
    Html.beginnerProgram 
    { model = 0 
    , view = view 
    , update = update 
    } 

अद्यतन देखें runelm example

+0

अब 1 मिलियन डॉलर का प्रश्न: उन्होंने क्यों एल्म रिएक्टर में इसे लागू करने के लिए देशी का सहारा लें और इसका उपयोग कहां किया जाता है? – Deimos

+0

'ग्राफिक्स.इनपूट' स्लाइडर्स का समर्थन नहीं करता है, और शायद इसे चाहिए, लेकिन 'elm-html' * वास्तविक तथ्य * मानक बन गया है - जैसा कि यह उदाहरण दिखाता है। मुझे लगता है कि स्लाइडर का उपयोग समय को साफ़ करने के लिए किया जाता है। – mgold

+0

मेरा उत्तर अपडेट किया गया - देर से मेलबॉक्स के आसपास अपना सिर लेने की कोशिश कर रहा है और यह परीक्षण करने का एक मौका था कि मेरे पास सबकुछ सीधे था –

3

मूल विचार यह है कि आपके मॉडल में संख्या का एक कैननिक प्रतिनिधित्व होना है। जब भी यह बदलता है (यह एक क्रिया होगी), आपको परवाह नहीं है कि परिवर्तन कहां से आया था, आप बस मॉडल को अपडेट करें। और फिर आप मॉडल में संख्या के मूल्य के आधार पर पाठ क्षेत्र और स्लाइडर दोनों प्रस्तुत करते हैं। (हम केवल एक नंबर के साथ एक टेक्स्ट फ़ील्ड की बात कर रहे हैं, न कि एक मुक्त फॉर्म पैराग्राफ बॉक्स, है ना?)

आशा है कि मदद करता है!

+0

हाँ, यह करता है, धन्यवाद। लेकिन दुर्भाग्य से, मैं केवल स्लाइडर को कॉलबैक प्रदान करता हूं (https://github.com/elm-lang/elm-reactor/blob/master/frontend/Slider.elm देखें) – Deimos

0

साइमन एच का मूल जवाब से, एल्म 0.18 के लिए अद्यतन:

import Html exposing (Attribute, div, text, input, beginnerProgram) 
import Html.Attributes as H exposing (..) 
import Html.Events exposing (on, onInput) 

type alias Model = Int 

type Msg 
    = Update String 

update : Msg -> Model -> Model 
update (Update v) model = 
    String.toInt (Debug.log "" v) |> Result.withDefault 0 

view model = 
    div [] 
    [ input 
     [ type_ "range" 
     , H.min "0" 
     , H.max "20" 
     , value <| toString model 
     , onInput Update 
     ] [] 
    , text <| toString model 
    ] 

main = 
    Html.beginnerProgram 
    { model = 0 
    , view = view 
    , update = update 
    } 
संबंधित मुद्दे