2017-10-07 25 views
1

私のアプリは、localstorageからflagsを通じてinitモデル値を取得します。モデルに新しいキーを追加しました。フラグを渡した値のキー( "bar")がないため、Elmアプリケーションを起動するときにエラーが発生します。将来新たな鍵を追加することができ、それが起こるたびにlocalstorageをクリアする必要がないことを考慮すると、フラグに鍵がないときにElmにデフォルト値を割り当てるよう指示する方法はありますか?Elmのフラッグに欠けているキーを処理する

type alias Model = 
    { foo : String, bar : Int } 

update : msg -> Model -> (Model, Cmd msg) 
update _ model = 
    model ! [] 

view : Model -> Html msg 
view model = 
    text <| toString model 

main : Program Flags Model msg 
main = 
    Html.programWithFlags 
     { init = init 
     , update = update 
     , view = view 
     , subscriptions = always Sub.none 
     } 

HTMLコードここ

<body> 
    <script> 
    var app = Elm.Main.fullscreen({foo: "abc"}) 
    </script> 
</body> 

答えて

3

は親切に提供エルムスラックチャネルで@ilias素晴らしいソリューションです。

https://ellie-app.com/mWrNyQWYBa1/0

module Main exposing (main) 

import Html exposing (Html, text) 
import Json.Decode as Decode exposing (Decoder) 
import Json.Decode.Extra as Decode --"elm-community/json-extra" 


type alias Model = 
    { foo : String, bar : Int } 


flagsDecoder : Decoder Model 
flagsDecoder = 
    Decode.map2 Model 
     (Decode.field "foo" Decode.string |> Decode.withDefault "hello") 
     (Decode.field "bar" Decode.int |> Decode.withDefault 12) 


init : Decode.Value -> (Model, Cmd msg) 
init flags = 
    case Decode.decodeValue flagsDecoder flags of 
     Err _ -> 
      Debug.crash "gracefully handle complete failure" 

     Ok model -> 
      (model, Cmd.none) 


update : msg -> Model -> (Model, Cmd msg) 
update _ model = 
    model ! [] 


view : Model -> Html msg 
view model = 
    text <| toString model 


main : Program Decode.Value Model msg 
main = 
    Html.programWithFlags 
     { init = init 
     , update = update 
     , view = view 
     , subscriptions = always Sub.none 
     } 

HTML

<body> 
    <script> 
    var app = Elm.Main.fullscreen({foo: "abc"}) 
    </script> 
</body>