我在榆树中使用"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
)
我仍在寻找让孩子返回更新种子的方法。
答案 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中适当地连接这些,但编译器将帮助解决这个问题。