Istniejący odpowiedź nie działa w wiąz v0.18 (Signal
został usunięty w 0.17), więc chciałem go zaktualizować. Pomysł polega na dodaniu przezroczystego tła najwyższego poziomu za menu rozwijanym. Ma to dodatkowy efekt, dzięki któremu możesz przyciemnić wszystko za menu, jeśli chcesz.
Ten przykładowy model ma listę słów, a każde słowo może mieć otwarte menu rozwijane (i niektóre powiązane informacje), więc mapuję je, aby sprawdzić, czy którekolwiek z nich są otwarte, w którym to przypadku wyświetlam tło div przed wszystkim innym:
jest zasłona w głównej funkcji widoku:
view : Model -> Html Msg
view model =
div [] <|
[ viewWords model
] ++ backdropForDropdowns model
backdropForDropdowns : Model -> List (Html Msg)
backdropForDropdowns model =
let
dropdownIsOpen model_ =
List.any (isJust << .menuMaybe) model.words
isJust m =
case m of
Just _ -> True
Nothing -> False
in
if dropdownIsOpen model then
[div [class "backdrop", onClick CloseDropdowns] []]
else
[]
CloseDropdowns
jest obsługiwana w funkcji aktualizacji najwyższego poziomu w aplikacji:
update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
case msg of
CloseDropdowns ->
let
newWords = List.map (\word -> { word | menuMaybe = Nothing }) model.words
in
({model | words = newWords}, Cmd.none)
I stylizowane elementy za pomocą scss:
.popup {
z-index: 100;
position: absolute;
box-shadow: 0px 2px 3px 2px rgba(0, 0, 0, .2);
}
.backdrop {
z-index: 50;
position: absolute;
background-color: rgba(0, 0, 0, .4);
top: 0;
right: 0;
bottom: 0;
left: 0;
}
Nie możesz wypróbować czegoś podobnego do znalezionych rzeczy React? Globalny moduł obsługi kliknięć wysyła "Akcja", która jest obsługiwana w funkcji 'update' nadrzędnej składnika (lub samego komponentu, jeśli uważasz, że jest to część jego zadania, aby wiedzieć, kiedy ma być ukryty) i ocenia, czy coś potrzebuje być ukrytym, a następnie odzwierciedlić to w swoim "Modelu". – Apanatshka
Dzięki za sugestię, postaram się zrobić coś takiego, a jeśli to zadziała, to w większości znajdę rozwiązanie (po prostu muszę się najpierw dowiedzieć więcej o modułach j. Macierzystych). Moją główną troską związaną z pójściem tą ścieżką (zakładając, że mówisz o dołączaniu opiekunów podczas montowania/odmontowywania wydarzeń, jak w przypadku rozwiązań React), było to, że może to pokonać cel FRP, jeśli i tak zamierzamy przełamać nałożone ograniczenia.Ale zdałem sobie sprawę, że może to być w porządku, jeśli jest używane tylko w takich rzadkich okazjach. – ave
Nie znam prawidłowego rozwiązania In-Elm, dlatego sugeruję, abyś zreplikował rozwiązanie React, aby rozwiązać problem. Ale otwórz dyskusję na temat listy mailingowej na temat tego problemu. Powinno być odpowiednie rozwiązanie, które nie wymaga tego rodzaju hackowania;) – Apanatshka