带标志的程序

programWithFlagsprogram 只有一点不同。

它可以在 JavaScript 初始化时接受数据:

var root = document.body;
var user = { id: 1, name: "Bob" };
var app = Elm.Main.embed( root, user );

从 JavaScript 传递的数据称为 Flags。

在此示例中,我们使用用户信息将 JavaScript 对象传递给 Elm,最好为 flags 指定 Type Alias。

type alias Flags =
    { id: Int
    , name: String
    }

标志传递给 init 函数,产生初始状态:

init : Flags -> ( Model, Cmd Msg )
init flags =
    let
        { id, name } =
            flags
    in
        ( Model id name, Cmd.none )

你可能会注意到它与类型签名的区别:

programWithFlags :
    { init : flags -> ( model, Cmd msg )          -- init now accepts flags
    , update : msg -> model -> ( model, Cmd msg )
    , subscriptions : model -> Sub msg
    , view : model -> Html msg
    }
    -> Program flags

初始化代码看起来几乎相同,因为它只是 init 函数不同。

main =
    programWithFlags
        { init = init
        , update = update
        , view = view
        , subscriptions = subscriptions
        }