榆树的翻译模式是什么?

时间:2016-12-13 20:35:02

标签: design-patterns functional-programming reactive-programming messages elm

elm git book中描述了一种体系结构,其中子组件生成通过主更新功能传播的消息,最终由子组件中的适当更新功能处理。翻译模式与此有何不同以及每种模式的用例是什么。请提供一个简单的例子。

1 个答案:

答案 0 :(得分:1)

每当你有一个嵌套的"组件"使用update函数,您需要确保父项通过子项Msgs和Cmds。 git book outlines this with a simple example(此代码位于父级,Widget是子级):

type Msg
  = WidgetMsg Widget.Msg

update message model =
  case message of
    WidgetMsg subMsg ->
      let
        ( updatedWidgetModel, widgetCmd ) =
          Widget.update subMsg model.widgetModel
      in
        ( { model | widgetModel = updatedWidgetModel }, Cmd.map WidgetMsg widgetCmd )

以上是任何时间孩子具有update功能的必要条件。但是,在上面的例子中,父母从不知道或不关心孩子的信息被传达给孩子。

但是现在,考虑父母需要知道孩子生成的消息的情况。例如:嵌套子组件需要与父母进行通信以使游戏丢失的游戏。

当父组件需要对子更新函数返回的消息作出反应时,Translator Pattern很有用。以下是链接示例中更新函数的基本结构:

GameMsg internalMsg -> 
  let
    (game_, cmd) 
       = Game.update internalMsg model.game
  in
    { model | game = game_ } ! [ Cmd.map gameTranslator cmd ]

请注意,它看起来很像早期的update示例;主要区别在于,而不是将Cmd直接映射到盲父Msg,因为第一个示例中的单个WidgetMsg仅传递给child Msg),gameTranslator映射函数允许您映射到其中一条父消息。

完整阅读Translator Pattern Blog Post可能会有所帮助。它是为Elm 0.17编写的,因此有一些语法更改,但总体思路仍然存在。