Следующий пример, который делает что-то похожее на то, что вы описываете.
modal
представлена с адресом (послать «Отклонить» событие), текущие размеры окна, а компонент ильма-HTML Html
(который является вещь, чтобы быть сфокусированы, как DatePicker или форму).
Мы прикрепляем обработчик кликов к окружающему элементу; предоставив ему соответствующий идентификатор, мы сможем разработать, если полученные клики применимы к нему или к ребенку, и направить их соответствующим образом. Единственный действительно умный бит - это развертывание customDecoder
для фильтрации кликов на дочернем элементе.
В другом месте, при приеме события «увольнение», наше состояние модели изменяется таким образом, что нам больше не нужно звонить modal
.
Это довольно большой пример кода, который использует ярмарки несколько вяза пакетов, поэтому, пожалуйста, спросите, если что требует дополнительного объяснения
import Styles exposing (..)
import Html exposing (Attribute, Html, button, div, text)
import Html.Attributes as Attr exposing (style)
import Html.Events exposing (on, onWithOptions, Options)
import Json.Decode as J exposing (Decoder, (:=))
import Result
import Signal exposing (Message)
modal : (Signal.Address()) -> (Int, Int) -> Html -> Html
modal addr size content =
let modalId = "modal"
cancel = targetWithId (\_ -> Signal.message addr()) "click" modalId
flexCss = [ ("display", "flex")
, ("align-items", "center")
, ("justify-content", "center")
, ("text-align", "center")
]
in div (
cancel :: (Attr.id modalId) :: [style (flexCss ++ absolute ++ dimensions size)]
) [content]
targetId : Decoder String
targetId = ("target" := ("id" := J.string))
isTargetId : String -> Decoder Bool
isTargetId id = J.customDecoder targetId (\eyed -> if eyed == id then Result.Ok True else Result.Err "nope!")
targetWithId : (Bool -> Message) -> String -> String -> Attribute
targetWithId msg event id = onWithOptions event stopEverything (isTargetId id) msg
stopEverything = (Options True True)
Не можете ли вы попробовать что-то похожее на найденный материал React? Глобальный обработчик кликов отправляет «Действие», которое обрабатывается функцией «update» родителя компонента (или самого компонента, если вы считаете его частью своей задачи, чтобы знать, когда нужно скрывать), и оценивает, нуждается ли что-то быть скрытым, а затем отразить это в вашей «Модели». – Apanatshka
Благодарим за предложение, я постараюсь сделать что-то подобное, и если это сработает, я сделаю все, что захочу (мне просто нужно сначала узнать о модулях Native js). Моя основная забота об этом пути (предполагая, что вы имеете в виду прикрепление обработчиков к событиям mount/unmount, например, к решениям React), заключалась в том, что это могло бы превзойти цель FRP, если мы будем нарушать наложенные ограничения в любом случае.Но я понял, что это может быть хорошо, если он используется только в редких случаях. – ave
Я не знаю правильного решения в Elm, поэтому я предлагаю вам реплицировать решение React, чтобы исправить вашу проблему сейчас. Но откройте дискуссию по списку рассылки об этой проблеме. Должно быть правильное решение, которое не требует таких хаков;) – Apanatshka