elm - 是否可以使用 elm-html 在一个事件上发送多条消息?

标签 elm

我想在一个事件中向不同的地址发送两条消息。
我遇到的特殊情况是我有一个弹出窗口,当用户点击“添加”时,我想:

  • 关闭弹窗(消息发送到弹窗组件)
  • 通知父组件应该添加项目(消息发送到父组件)

  • onClick 具有以下类型“地址 a -> a -> 属性”,有些似乎不可能这样做。另一方面,在实践中似乎经常会遇到这种模式(一个操作导致多个消息)。

    现在,我求助于发送一条消息通知父级添加的项目,然后父级在更新功能中使用隐藏操作更新弹出窗口。
    addButton = button [onClick context.addTaskAddress model.taskDescription] [text "Add"]
    

    然后在父组件的更新功能中
    popup = AddTaskPopup.update AddTaskPopup.Hide model.popup
    

    最佳答案

    您可以设置一个中间代理邮箱,该邮箱采用地址和消息对列表,然后通过单击按钮调用该邮箱。

    proxy : Mailbox (List (Address a, a))
    proxy =
      mailbox []
    

    然后你可以有一个广播信号来监听代理邮箱并创建一堆 Signal.send通知其他地址的任务。

    port broadcast : Signal (Task x (List ()))
    port broadcast =
      let
        tasks = List.map (uncurry Signal.send)
      in
        Signal.map (Task.sequence << tasks) proxy.signal
    

    您的 onClick代码看起来像这样,您在其中传递地址和操作对的列表:

    onClick proxy.address [(address, Action1), (address, Action2)]
    

    注意上面代码中,address指进入 View 函数的地址,而proxy.address指的是我们刚刚设置的代理邮箱。

    这是一种通用解决方案,适用于任意数量的信号。

    关于elm - 是否可以使用 elm-html 在一个事件上发送多条消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35242623/

    相关文章:

    elm - 您如何管理更新路径/消息构造函数的爆炸式增长?

    elm - 如何在 Elm 中使用 StartApp 内部的端口

    elm - 为什么 `NaN` 是 Elm 中类型 `Int` 的可能值?

    elm - 为什么我不能在Elm 0.19中使用 `onWithOptions`

    haskell - 如何在 Elm(或 Haskell)中的函数之间共享数据

    elm - Elm 是否允许循环引用?

    visual-studio-code - 编译错误 : openFile: does not exist (No such file or directory)*

    clipboard - 榆树:将文本复制到剪贴板

    elm - 模式匹配标记的联合类型

    byte - Http.get 中的 Elm 字节解码