Ваш пример, кажется, не иллюстрирует вашу реальную проблему, но из этого, нашего предыдущего разговора и комментария к ответу @ Jessta, я предполагаю, что на самом деле вы хотите использовать Dict
для отслеживания вашей поля. Если это так, сначала нам нужно изменить модель:
type alias Model =
{ fields : Dict String String }
. В качестве ключа используется идентификатор String
, а в качестве значения используется только текст String
. Если вам нужно сохранить другую информацию, вам придется заменить последний String
на тип вашей модели поля.
Затем нам нужно инициализировать модель. Мы делаем это с той же информацией, которую вы имели в своем примере, но теперь она содержится в Dict
:
init : () -> ( Model, Cmd Msg )
init () =
( { fields =
Dict.fromList
[ ( "field1", "value1" )
, ( "field2", "value2" )
]
}
, Cmd.none
)
. Рендеринг представления выполняется путем преобразования Dict
в List
, а затем сопоставляя его с Html
элементами:
view : Model -> Html Msg
view model =
div []
(model.fields
|> Dict.toList
|> List.map
(\( id, value ) ->
div
[ contenteditable True
, attribute "data-id" id
, onBlur (Update id)
]
[ text value ]
)
)
Для краткости я пропустил два div "display", так как они казались ненужными, но добавление их в конце просто требует сделать это снова, но с другим рендером. функция. И если вам действительно нужно, чтобы они были братьями и сестрами contenteditable
s, просто объедините два результирующих списка элементов.
И, наконец, чтобы обновить модель поля, мы просто используем Dict.update
с id
и функция обновления поля:
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
Update id text ->
( { model
| fields =
Dict.update id
(\_ -> Just text)
model.fields
}
, Cmd.none
)
Вот и все. Я надеюсь, что понял проблему достаточно хорошо, чтобы это помогло. Если нет, я думаю, вам просто придется попытаться объяснить это снова.