如何从Elm中访问窗口对象?

时间:2017-05-16 15:14:52

标签: elm

具体来说,我试图用已定义的参数初始化Elm。类似的东西:

initialModel =
    { me = window.user
    , todos = window.todos
    }

所有我能找到的是如何使用信号获得窗口尺寸,但我在Elm 0.18上看起来有点过时了。

编辑:为了清楚起见,上面的代码不起作用。无论附加到window对象的是什么,都必须是JS,所以它必须通过解码器。

1 个答案:

答案 0 :(得分:3)

您需要使用programWithFlags从javascript传递初始值。 "标志"如果你想使用Elm的自动类型转换,你从javascript传递应该有相同的记录类型:

让我们说你的me只是一个字符串,但你的todos是一个布尔标志和一个标签的列表。您的Flags类型可能如下所示:

type alias Todo =
    { done : Bool, label : String }

type alias Flags =
    { me : String, todos : List Todo }

您的init函数需要适当地处理标志值。以下是仅将字段分配给同名的模型字段的示例:

type alias Model =
    { me : String, todos : List Todo }

main : Program Flags Model Msg
main =
    Html.programWithFlags
        { init = init
        , view = view
        , update = update
        , subscriptions = \_ -> Sub.none
        }

init : Flags -> ( Model, Cmd Msg )
init flags =
    { me = flags.me, todos = flags.todos } ! []

您的javascript需要更新才能传递旗帜。您可以将json对象作为第一个参数传递给全屏或嵌入:

var app = Elm.Main.fullscreen({
  "me": "John Doe",
  "todos": [
    { done: true, label: "Do this thing" },
    { done: false, label: "And this thing" }
  ]
});

这是working example on ellie-app.com

如果Elm的自动json-to-mapping转换不足以进行解码,您可以使用Json.Decode.Value类型作为标志,然后Json.Decode.decodeValue使用您的客户解码器。 Here is an example on ellie-app.com of using a custom decoder