2017-08-11 96 views
0

我在Elm中使用的是"compose" pattern从Elm的父项更改构件模型

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)时检索该值,以便随后可以根据需要更新其他小部件的种子。

我该如何从update函数Main中为子控件生成消息,以便我可以将种子传给孩子?孩子如何将更新的种子返回给父母?

UPDATE:

我想通了如何通过种子下到子部件,虽然我不能肯定,这是最好的办法。

孩子的代码如下所示:

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 
       ) 

我仍然在寻找一种方式来将孩子归还更新的种子。

回答

2

虽然在任何榆树程序顶级更新功能必须

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) 

您需要的课程主要适当连线,这些都起来,你可以走了,但是编译器将与帮助。