を必要とする場合、既存の答えはニレv0.18では動作しませんSignal
を依頼してください、公正少数のニレのパッケージを利用した、非常に大規模なコードサンプルです0.17で削除されたので)、私はそれを更新したいと思いました。考え方は、ドロップダウンメニューの後ろにトップレベルの透明な背景を追加することです。あなたが望むなら、これはメニューの後ろのすべてを暗くすることができるというボーナス効果を持っています。
このモデル例では単語のリストがあり、単語には開いているドロップダウン(および関連する情報)がある場合があります。そのため、そのうちのいずれかが開いているかどうかを調べて、他のすべての前に:
メインビュー機能の背景があります:
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
は、アプリケーションのトップレベルの更新機能で処理されます。
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)
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;
}
あなたが見つけたReactのものに似たものを試すことはできませんか?グローバルクリックハンドラは、コンポーネントの親の 'update'関数で処理された' Action'を送信します(コンポーネント自体を非表示にすることをタスクの一部とみなす場合、コンポーネント自体を必要とするかどうか評価します)隠しておいて、それをあなたの 'Model'に反映させます。 – Apanatshka
提案をいただきありがとうございます。そのようなことをやろうとします。それがうまくいく場合、私はほとんどのソリューションを提供します(最初にネイティブjsモジュールについてもっと学ぶ必要があります)。私が主張しているのは、この解決策を実行することです(Reactソリューションのようなマウント/マウント解除イベントにハンドラを取り付けることを前提としています)と、強制された制限を破棄する場合は、しかし、まれにしか使用されないと大丈夫かもしれないことに気付きました。 – ave
私はElmの適切なソリューションについてはわかりません。そのため、Reactソリューションを複製して今すぐ問題を解決することをお勧めします。しかし、この問題についてのメーリングリストに関する議論を開く。 )これらの種類のハッキングを必要としない適切な解決方法があるはずです; – Apanatshka