Without seeing the full code it is hard to give better advice. Here's an 

An isolated SearchForm TEA: 
See the highlighted lines for the returned component event instead of an 
elm Cmd. Previously I've had that update function return a 3 tuple with 
commands if needed: update : Msg -> Model -> (Model, Cmd Msg, Maybe Event) 
which seems like what you need. The order doesn't matter, do it as you 

See the SearchForm wired up in the main App.elm: 
That's where the parent TEA component deals with the form event, and acts 
on it by triggering a Cmd, etc.

As mentioned elsewhere, making full TEA (init,update,view,subscriptions) 
reusable components in elm can be painful to wire up, so I would suggest 
not doing so unless/until you really have to use a component in several 
places or are publishing a library with one.

For that project I linked to, I wanted to get a taste of developing 
reusable components with Elm, even though the app was pretty small. I've 
later refactored it to what I'd consider a more maintainable version and it 
got considerably smaller and with less boilerplate (which makes it easier 
to understand): 

I'd recommend reading more about reuse too https://guide.elm-lang.org/reuse/

On Saturday, September 17, 2016 at 1:32:39 AM UTC+2, Matteo Giachino wrote:
> Hello everybody, I have a problem and I can't find a solution.
> The code consist in 3 modules. *Main*, *ItemList* and *Form*
> The *Main* is the glue and message broker of the app. The other two are a 
> list and a form to update the list.
> The list has it's logic to fetch the results from an api, with all it's 
> internal events that gets routed through the update function of *Main* 
> with Cmd.map.
> The form is exactly the same. With internal events to manage its state and 
> an add button to trigger an HTTP POST request to update the database.
> Everything is great and separated. But the problem is the "ADD" button. 
> When I press it, I want to perform a post, and on the form event 
> UpdateSucceed I want to update the list!
> Here is the relevant code of Main.elm
> update : Msg -> Model -> ( Model, Cmd Msg )
> update msg model =
>     case msg of
>         FormMsg formMsg ->
>             let
>                 ( updatedItem, formCmd ) =
>                     Form.update formMsg model.newItem
>             in
>                 ( { model | newItem = updatedItem }
>                 , Cmd.map FormMsg formCmd
>                 )
>         ItemListMsg itemListMsg ->
>             let
>                 ( updatedList, itemListCmd ) =
>                     ItemList.update itemListMsg model.items
>             in
>                 ( { model | items = updatedList }
>                 , Cmd.map ItemListMsg itemListCmd
>                 )
> here is the update function of Form.elm
> update : Msg -> Item -> ( Item, Cmd Msg )
> update msg model =
>     case msg of
>         ...
>         Add ->
>             ( model, doAddItem model )
>         UpdateSucceed newItem ->
>             ( initialModel, Cmd.none )
> I searched through the posts and everybody is suggesting to change the 
> signature of the Form module update function, and return a third element, 
> the outgoing message. I could go for it, but I really struggling to 
> understand how to handle it in the Main update function, because one 
> command is handled by the elm runtime on every message that arrives to 
> update. I don't understand where I should manage this 2 different things to 
> do when UpdateSucceed is triggered on the form. Re initialize the model in 
> the form (clear the fields) and trigger an event that in some way gets 
> routed through the Main module to the ItemList module.
> Any help is appreciated, this is a personal project, so I'm eager to learn 
> the most elegant way to handle this situation, and refactoring is not a 
> problem.

You received this message because you are subscribed to the Google Groups "Elm 
Discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to elm-discuss+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to