0

В описании elm git book описана архитектура, в которой дочерние компоненты генерируют сообщения, которые распространяются посредством основной функции обновления, в конечном итоге обрабатываются соответствующей функцией обновления в дочернем компоненте. Как отличается шаблон переводчика от этого и каковы варианты использования каждого шаблона. Просьба привести простой пример.Что такое шаблон переводчика в вязах?

ответ

1

Всякий раз, когда у вас есть вложенный «компонент» с функцией 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, поэтому есть несколько синтаксических изменений, но общая идея все же сохраняется.

+0

было бы '= Game.update internalMsg model.game' вместо этого, @ChadGilbert – sjt003

+0

Хороший улов! Да, это было бы, и я исправил пример. Я скопировал его дословно из сообщения в блоге. –

+0

Я прочитаю, что, спасибо - отмечен как принято – sjt003

 Смежные вопросы

  • Нет связанных вопросов^_^