不使用任务从组件调用更新功能

Sam*_*ton 4 components parent-child elm

我有一个带有主应用程序和组件的elm项目.

我希望该组件具有自己的内部更新,并且还能够更新主模型.

我希望组件的update功能能够运行一个Cmd将数据传递到主应用程序并更改主应用程序URL的功能.

我发现能够做到这一点的唯一方法是使用Task.performTask.succeed.

是否可以不使用Task.performTask.succeed?在这种情况下使用Task.performTask.succeed模式的负面影响是什么?

Jos*_*ens 5

简短回答:

在父模型中,存储子模型的副本.并且在父更新方法中,处理孩子的消息,并调用孩子的更新功能.IE:

--In Parent
type alias ParentModel = {
    childModel : ChildModel
}

Type Msg 
    = ChildMsg Child.Msg

case ParentMsg parentMsg ->
    let
        ( newChildModel, childMsg ) =
            Child.update parentMsg model.childModel
    in
        ( { model | childModel = newChildModel }, Cmd.map ParentMsg childMsg )

view model =
    Html.map ParentMsg (Child.view model.childModel)
    ...
Run Code Online (Sandbox Code Playgroud)

答案很长:父子关系更像是一种面向对象的编程风格,这在函数式语言中很难实现.就像功能编程在面向对象语言中很难做到一样.使用该语言的设计方式更容易使用.如果您对如何以功能样式组织代码感兴趣,请查看Richard Feldmans Scaling Elm视频,或者如果您有兴趣在榆树应用程序中跨多个页面组织代码,请查看此示例git repo Richard创建的