2016-06-23 6 views
7

एल्म की कोशिश करते समय मैंने एक मुद्दे में टक्कर लगी है। मैं एक बंदरगाह के माध्यम से एक संघ प्रकार पारित करने के लिए चाहते हैं, लेकिन मैं इस त्रुटि मिलती है:एल्म बंदरगाहों के माध्यम से यूनियन प्रकार कैसे पास करें?

Port `setStorage` is trying to communicate an unsupported type. 

34| port setStorage : Model -> Cmd msg 
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
The specific unsupported type is: 

    Todo.Importance 

The types of values that can flow through in and out of Elm include: 

    Ints, Floats, Bools, Strings, Maybes, Lists, Arrays, 
    Tuples, Json.Values, and concrete records. 

मैं तोदो example संशोधित कर लिया है इस प्रकार है:

type alias Task = 
    { description : String 
    , completed : Bool 
    , editing : Bool 
    , id : Int 
    , importance : Importance 
    } 

type Importance 
    = Normal 
    | High 
    | Low 

यह issue प्रतीत होता है काफी पुराना होने के लिए। एक टिप्पणीकर्ता "जेसन को पास करता है। बंदरगाहों और जेसन के माध्यम से मूल्य। डीकोड/उन्हें एनकोड करें" लेकिन यह वास्तव में कैसे करें? दस्तावेज़ीकरण थोड़ा अस्पष्ट दिखाई देता है और इसमें पूर्ण उदाहरण नहीं हैं। किसी भी मदद की सराहना की।

उत्तर

7

मैंने इसे work जेसन। डेकोडर/एनकोडर के साथ बनाया है। यह सब मुश्किल नहीं था, हालांकि हर एक क्षेत्र को क्रमबद्ध करने के लिए बस एक यूनियन प्रकार को काफी बोझ उठाना है।

डिकोडर्स:

modelDecoder : Json.Decoder Model 
modelDecoder = 
    Json.object4 Model 
    ("tasks" := Json.list taskDecoder) 
    ("field" := Json.string) 
    ("uid" := Json.int) 
    ("visibility" := Json.string) 

taskDecoder : Json.Decoder Task 
taskDecoder = 
    Json.object5 Task 
    ("description" := Json.string) 
    ("completed" := Json.bool) 
    ("editing" := Json.bool) 
    ("id" := Json.int) 
    ("importance" := Json.string `andThen` importanceDecoder) 

importanceDecoder : String -> Json.Decoder Importance 
importanceDecoder tag = 
    case tag of 
    "Normal" -> Json.succeed Normal 
    "High" -> Json.succeed High 
    "Low" -> Json.succeed Low 
    _ -> Json.fail (tag ++ " is not a recognized tag for Importance") 

और एनकोडर:

modelToValue : Model -> Json.Encode.Value 
modelToValue model = 
    Json.Encode.object 
    [ 
     ("tasks", Json.Encode.list (List.map taskToValue model.tasks)), 
     ("field", Json.Encode.string model.field), 
     ("uid", Json.Encode.int model.uid), 
     ("visibility", Json.Encode.string model.visibility) 
    ] 

taskToValue : Task -> Json.Encode.Value 
taskToValue task = 
    Json.Encode.object 
    [ 
     ("description", Json.Encode.string task.description), 
     ("completed", Json.Encode.bool task.completed), 
     ("editing", Json.Encode.bool task.editing), 
     ("id", Json.Encode.int task.id), 
     ("importance", importanceToValue task.importance) 
    ] 

importanceToValue : Importance -> Json.Encode.Value 
importanceToValue importance = 
    case importance of 
    Normal -> Json.Encode.string "Normal" 
    High -> Json.Encode.string "High" 
    Low -> Json.Encode.string "Low" 
+1

यह सुविधा जल्द ही एल्म स्लैक @rtfeldman कहते हैं इस सुविधा प्राथमिकता सूची पर जिस तरह से नीचे है पर अधिक लागू नहीं किया जाएगा ... और अगर वह अगले वर्ष में हुआ तो वह आश्चर्यचकित होगा। यह 23 मई, 2017 तक था। –

3

आप ऊपर से एक यूनियन प्रकार नहीं पारित कर सकते हैं क्योंकि जेएस ऐसी चीज़ के बारे में नहीं जानता है। तो आप एक स्ट्रिंग भी पास कर सकते हैं और जावास्क्रिप्ट में केस स्टेटमेंट कर सकते हैं - मैं इसे हर समय करता हूं।

संबंधित मुद्दे