У меня динамически создаются компоненты Javascript, которые обмениваются данными через порты с моделью Elm. Они посылают данные через порт формы port sendData : ((ComponentId, String) ...
Elm 0.18: Как перенаправить сообщения с Sub.map на основе их содержимого?
На стороне вяза есть ChildComponent
модуль, который представляет свои модели:
type alias ComponentId =
Int
port sendData : ((ComponentId, String) -> msg) -> Sub msg
type Msg
= ProcessData String
subscriptions : Model -> Sub Msg
subscriptions model =
Sub.batch [
sendData ProcessData
]
В Parent
у меня есть:
update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
case msg of
ChildMessage componentId msg -> ...
subscriptions : Model -> Sub Msg
subscriptions model =
Sub.batch
[ Sub.map (ChildMessage componentId) (ChildComponent.subscriptions model.child) ]
Очевидно, что это приводит в
Cannot find variable `componentId`
310| Sub.map (ChildMessage componentId) (ChildComponent.subscriptions (getChildModel (componentId model))) ]
^^^^^^^^^^^
«извлечь» componentId
из данных, поступающих из порта? Или возможно, что я делаю, это совершенно неправильно?
Update
Я изолировал проблему (с некоторыми дополнениями, предложенного @ChadGilbert) в проект https://github.com/lguminski/ElmMultipleComponentsSubscription
спасибо! @ChadGilbert, мы почти там. Единственная проблема заключается в том, что существует несколько дочерних элементов, поэтому 'model.child' не может быть предоставлен заранее, как вы предложили. Он также должен быть рассчитан динамически на основе сообщения. Для иллюстрации этого я создал https://github.com/lguminski/ElmMultipleComponentsSubscription. –
Я обновил свой ответ с небольшими изменениями в вашем дизайне, а также создал запрос на перенос вашего кода с рабочим примером. –
Спасибо @ChadGilbert. Я вижу, что вы повысили привязку к ребенку (порт и подписки) до уровня родителя и обрабатываете его там. На самом деле это то, чего я пытался избежать, поскольку я воспринимаю это как утечку абстракции ребенка. Я надеялся, что есть способ инкапсулировать все это в Child. Но, возможно, это невозможно. Позвольте моему вопросу быть открытым в течение нескольких дней, и если никто не придет к лучшей идее, я буду принимать вас в качестве действительного обходного пути. Еще раз спасибо. –