Ví dụ sau thực hiện điều gì đó tương tự như những gì bạn mô tả.
modal
được trình bày với một địa chỉ (để gửi sự kiện 'loại bỏ'), kích thước cửa sổ hiện tại và thành phần elm-html Html
(là thứ cần được tập trung, như biểu tượng ngày hoặc biểu mẫu).
Chúng tôi đính kèm trình xử lý nhấp chuột vào phần tử xung quanh; đã cho nó một id thích hợp, chúng tôi có thể làm việc ra nếu nhận được nhấp chuột áp dụng cho nó hoặc đứa trẻ, và chuyển tiếp chúng một cách thích hợp. Bit duy nhất thực sự thông minh là triển khai customDecoder
để lọc ra các nhấp chuột trên phần tử con.
Ở những nơi khác, khi nhận được sự kiện 'loại bỏ', trạng thái mô hình của chúng tôi thay đổi sao cho chúng tôi không cần phải gọi số modal
nữa.
này là khá một mẫu mã lớn mà làm cho việc sử dụng một vài gói elm công bằng, vì vậy hãy hỏi bất cứ điều gì cần giải thích thêm
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)
Bạn có thể thử một thứ gì đó tương tự với nội dung React mà bạn tìm thấy không? Trình xử lý nhấp chuột toàn cục gửi 'Hành động' được xử lý trong hàm' update' của cha mẹ của thành phần (hoặc chính thành phần đó, nếu bạn coi đó là một phần của nhiệm vụ cần biết khi nào bị ẩn) và đánh giá xem có cần gì không bị ẩn, sau đó phản ánh điều đó trong 'Mô hình' của bạn. – Apanatshka
Cảm ơn bạn đã đề xuất, tôi sẽ cố gắng làm một việc như vậy và nếu nó hoạt động, tôi sẽ giải quyết hầu hết (tôi chỉ cần tìm hiểu thêm về mô-đun js Native trước). Mối quan tâm chính của tôi khi đi với con đường này (giả sử bạn có nghĩa là gắn các trình xử lý trên các sự kiện mount/unmount như trên các giải pháp React) là điều này có thể đánh bại mục đích của FRP nếu chúng ta sẽ phá vỡ các hạn chế áp đặt.Nhưng tôi nhận ra rằng nó có thể ổn nếu nó chỉ được sử dụng trong những dịp hiếm hoi như vậy. – ave
Tôi không biết một giải pháp thích hợp trong Elm, vì vậy đó là lý do tại sao tôi đề nghị bạn tái tạo giải pháp React để khắc phục sự cố của bạn ngay bây giờ. Nhưng hãy mở một cuộc thảo luận về danh sách gửi thư về vấn đề này. Nên có một giải pháp thích hợp mà không yêu cầu những loại hack này;) – Apanatshka