单击按钮时未调用更新功能

时间:2017-06-06 16:41:26

标签: elm

单击按钮(应发送消息)后,不会调用我的更新功能。

这里是应该使用onClick事件触发函数的代码:

[ input [ type_ "submit", onClick TopicSelected, value (getTopic topic) ] []

这里是更新功能:

update : Msg -> Model -> Model
update msg model =
    case msg of
        TopicSelected ->
            { model
                | articles = []
                , podcasts = []
                , videos = []
            }

view model =
    div []
        [ table []
            [ tr [] [ td [] [ b [] [ text "Videos" ] ] ]
            , div [] <| contentUI model.videos
            , tr [] [ td [] [ b [] [ text "Podcasts" ] ] ]
            , div [] <| contentUI model.podcasts
            , tr [] [ td [] [ b [] [ text "Articles" ] ] ]
            , div [] <| contentUI model.articles
            ]
        ]

这里是路由然后onClick事件的整个函数:

topicTocheckbox : Topic -> Html Msg
topicTocheckbox topic =
    div []
        [ input [ type_ "submit", onClick TopicSelected, value (getTopic topic) ] []
        , label [] [ text <| getTopic topic ]
        ]

code can be found on GitHub

1 个答案:

答案 0 :(得分:1)

查看您的代码,您尝试在Home.elm中使用Contributor.elm的嵌套“组件”,但是您没有在父(Home)更新函数中进行连接。

这是榆树社区中一个广泛而有争议的话题。除非绝对必要,否则典型的建议是尽量避免这样嵌套。

如果您绝对需要以这种方式进行嵌套,那么您的代码将会出现update个案例的变体:

type ParentMsg
    = ...
    | ChildMsg Child.Msg

type alias ParentModel =
    { ...
    , child : Child.Model
    }

case msg of
    ChildMsg childMsg ->
        let (childModel, childCmd) = Child.update childMsg model.child
        in { model | child = childModel } ! [ Cmd.map ChildMsg childCmd ]

在每个图层嵌套时,您需要连接子状态并来回传递子Msg和Cmds。

复杂的是,在你的代码中,你正在处理一个贡献者列表,这意味着你还需要传递一个索引,以便你知道你正在编辑的列表中的哪个贡献者( here is a minimal example of updating model array elements)。

好消息是Elm让重构变得轻而易举!