2017-08-11 99 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) 

您需要的課程主要適當連線,這些都起來,你可以走了,但是編譯器將與幫助。