我的主程序有一个
update
功能
update : Msg -> Model -> ( Model, Cmd Msg )
为了与子组件通信,我们可以添加另一个变量并将消息包装为新消息。
type alias Model =
{ ...
, child : Child.Model
}
type Msg
= ...
| ChildMsg Child.Msg
update msg model =
case msg of
...
ChildMsg childMsg ->
let
( childModel, cmd ) =
Child.update childMsg model.child
updatedModel =
{ model | child = childModel }
childCmd =
Cmd.map ChildMsg cmd
in
( updatedModel, childCmd )
但是,如果子组件的类型
更新
函数与父级不匹配。考虑一个具有多态更新函数的孩子:
-- PolymorphicChild.elm
update : Msg a -> Model -> ( Model, Cmd (Msg a) )
从这个模块运行命令时,我必须包装它
PolymorphicChild.someCommand : Cmd (Msg Foo)
PolymorphicChild.someCommand
|> Cmd.map PolymorphicChild
但是,这会产生一个
Msg (PolymorphicChild.Msg Foo)
,而不是
Msg PolymorphicChild.Msg
我的应用程序正在等待。
The right side of (|>) is causing a type mismatch.
(|>) is expecting the right side to be a:
Cmd (PolyMorphicChild.Msg Foo) -> a
But the right side is:
Cmd Polymorphic.Msg -> Cmd Msg
我试着将一个多态参数添加到
App.Msg
-- App.elm
type Msg a =
= ..
| PolymorphicChildMsg (PolymorphicChild.Msg a)
但它基本上摧毁了我的整个计划。涉及的每个功能
应用程序消息
需要以某种方式更改以使用新的子组件。
如何统一这两种类型并使两个组件协同工作?