2017-08-11 13 views
0

J'utilise le "compose" pattern dans Elm.Modifier le modèle de widget à partir de parent dans Elm

Dans Main.elm, je me générer une semence initiale de Random en utilisant ce qui suit:

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) 

qui semble bien fonctionner pour initialiser la graine de générateur de nombres aléatoires à une valeur de départ aléatoire.

J'ai un widget "indépendant" qui est utilisé dans l'application principale. Je voudrais passer la graine à ce widget à la réception du message InitializeSeed et ensuite récupérer la valeur comme il change dans le widget enfant (en utilisant Random.step) afin que je puisse ensuite mettre à jour les graines d'autres widgets car ils ont besoin du générateur.

Comment puis-je générer un message pour le widget enfant à partir de la fonction update dans Main afin que je puisse transmettre le message à l'enfant? Comment l'enfant peut-il renvoyer la graine mise à jour au parent?

MISE À JOUR:

je me suis dit comment passer la graine vers le widget enfant, bien que je ne suis pas certain que ce soit la meilleure façon.

Le code de l'enfant ressemble à ceci:

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

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

et le parent, j'ai modifié la fonction update comme ceci:

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 
       ) 

Je cherche toujours un moyen d'avoir le retour des enfants la graine mise à jour.

Répondre

2

Bien que la fonction de mise à jour de haut niveau dans tout programme Elm doit être

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

il n'y a aucune limite sur la forme de l'un de ses descendants. Donc, rien ne vous empêche de définir pour votre enfant

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

ou, si l'enfant ne retourne jamais des commandes

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

Peut-être que vous avez plusieurs choses à transmettre, y compris par exemple un message parent. Ensuite, vous pouvez aller aussi loin que

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

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

Vous devez câbler ces tout correctement dans principal bien sûr, mais le compilateur aider.