帶標誌的程式

programWithFlagsprogram 只有一點不同。

它可以在 JavaScript 初始化時接受資料:

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

從 JavaScript 傳遞的資料稱為 Flags。

在此示例中,我們使用使用者資訊將 JavaScript 物件傳遞給 Elm,最好為 flags 指定 Type Alias。

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

標誌傳遞給 init 函式,產生初始狀態:

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

你可能會注意到它與型別簽名的區別:

 placeholderCopyprogramWithFlags :
    { 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 函式不同。

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