В описании elm git book описана архитектура, в которой дочерние компоненты генерируют сообщения, которые распространяются посредством основной функции обновления, в конечном итоге обрабатываются соответствующей функцией обновления в дочернем компоненте. Как отличается шаблон переводчика от этого и каковы варианты использования каждого шаблона. Просьба привести простой пример.Что такое шаблон переводчика в вязах?
ответ
Всякий раз, когда у вас есть вложенный «компонент» с функцией update
, вам необходимо убедиться, что родительский элемент проходит через дочерние Msgs и Cmds. Мерзавец книга 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
функцию. Однако в приведенном выше примере родитель никогда не знает или не заботится о том, какие дочерние сообщения передаются ребенку.
Теперь рассмотрим случай, когда родитель должен знать о Msg, сгенерированном дочерним элементом. Например: игра, в которой вложенный дочерний компонент должен взаимодействовать с родителем, чтобы игра была потеряна.
Translator Pattern полезен, когда родительский компонент должен реагировать на сообщение, возвращенное из дочерней функции обновления. Вот основная структура функции обновления в связанном примере:
GameMsg internalMsg ->
let
(game_, cmd)
= Game.update internalMsg model.game
in
{ model | game = game_ } ! [ Cmd.map gameTranslator cmd ]
Обратите внимание, что это выглядит как ранее update
примера; Основное различие заключается в том, что вместо отображения Cmd
непосредственно слепого родитель Msg
(слепого в том, что в одном WidgetMsg
первого примера прошел вокруг ребенка Msg
), функция gameTranslator
отображения позволяет сопоставить одному из родителей Сообщения.
Возможно, полезно прочитать Translator Pattern Blog Post в полном объеме. Это было написано для Elm 0.17, поэтому есть несколько синтаксических изменений, но общая идея все же сохраняется.
было бы '= Game.update internalMsg model.game' вместо этого, @ChadGilbert – sjt003
Хороший улов! Да, это было бы, и я исправил пример. Я скопировал его дословно из сообщения в блоге. –
Я прочитаю, что, спасибо - отмечен как принято – sjt003