具体来说,我试图用已定义的参数初始化Elm。类似的东西:
initialModel =
{ me = window.user
, todos = window.todos
}
所有我能找到的是如何使用信号获得窗口尺寸,但我在Elm 0.18上看起来有点过时了。
编辑:为了清楚起见,上面的代码不起作用。无论附加到window
对象的是什么,都必须是JS,所以它必须通过解码器。
答案 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