在Elm中从父级更改小部件模型

时间:2017-08-11 15:03:28

标签: random composition elm messages

我在榆树中使用"compose" pattern

Main.elm中,我使用以下内容为Random生成初始种子:

type alias Model =
    { ...
    , seed : Seed
    }

initialModel : Model
initialModel =
    { ...
    , seed = initialSeed 0
    }

init : ( Model, Cmd Msg )
init =
    ( initialModel, generate InitializeSeed (int minInt maxInt) )

type Msg
    = ...
    | InitializeSeed Int

update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
    case msg of
        ...

        InitializeSeed value ->
            ( { model | seed = Random.initialSeed value }, Cmd.none )

似乎可以很好地将随机数生成器种子初始化为随机起始值。

我有一个独立的"主应用程序中使用的小部件。我希望在收到InitializeSeed消息后将种子传递给该窗口小部件,然后在子窗口小部件中更改时检索该值(使用Random.step),以便我可以更新其他窗口小部件&# 39;种子,因为他们需要发电机。

如何从update中的Main函数为子窗口小部件生成消息,以便将种子传递给孩子?孩子如何将更新的种子返回给父母?

更新

我想出了如何将种子传递给子窗口小部件,虽然我不确定这是最好的方法。

子代码如下所示:

type alias Model =
    { ...
    , seed : Seed
    }

replaceSeed : Model -> Seed -> Model
replaceSeed model seed =
    { model | seed = seed }

在父母中,我修改了update函数,如下所示:

update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
    case msg of
        ...
        InitializeSeed value ->
            let
                seed =
                    Random.initialSeed value

                child_ =
                    Child.replaceSeed model.child seed
            in
                ( { model
                    | seed = seed
                    , child = child_
                  }
                , Cmd.none
                )

我仍在寻找让孩子返回更新种子的方法。

1 个答案:

答案 0 :(得分:2)

虽然任何Elm程序中的顶级更新功能必须

update : Msg -> Model -> (Model, Cmd Msg)

对其任何后代的形状没有限制。所以没有什么可以阻止你为你的孩子定义

update : Seed -> Msg -> Model -> (Model, Cmd Msg, Seed)

或者,如果孩子永远不会返回任何命令

update : Seed -> Msg -> Model -> (Model, Seed)

也许你有几件事要传递,包括例如父信息。然后你可以走到

type alias Config msg = 
    { seed : Seed 
    , someParentMessage : String -> msg 
    }

update : Config msg -> Msg -> Model -> (Model, Maybe (Cmd msg), Seed)

当然,您需要在Main中适当地连接这些,但编译器将帮助解决这个问题。