2017-08-11 9 views
0

私はElmに"compose" patternを使用しています。 Main.elmElmの親からウィジェットモデルを変更

、私は次のように使用して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) 

あなたはもちろん、メインでこれらのすべてを適切に配線する必要がありますが、コンパイラはそれを助けるでしょう。

関連する問題