4 votes

Dans Elm, comment puis-je détecter si la mise au point sera perdue à partir d'un groupe d'éléments ?

Supposons que j'ai un formulaire avec un certain nombre de composants. J'aimerais détecter une perte de focus du groupe . Ainsi, la mise au point d'une entrée à une autre sur le même formulaire doit être ignorée. Comment puis-je réaliser cela ?

12voto

z5h Points 8029

Tout d'abord, nous voulons être en mesure de marquer chaque élément focalisable au sein du groupe avec un attribut, de sorte que lorsque nous changeons d'élément, nous sachions si nous sommes dans le même groupe ou non. Cela peut être réalisé avec des attributs de données.

groupIdAttribute groupId =
    Html.Attributes.attribute "data-group-id" groupId

Ensuite, nous devons décoder la charge utile de l'événement sur un fichier onBlur pour voir si le target est différente de la relatedTarget (ce qui fera l'objet d'une attention particulière). Et signalez le changement. (notez qu'ici nous faisons référence à data-group-id via le chemin "dataset", "groupId" )

decodeGroupIdChanged msg =
    Json.Decode.oneOf
        [ Json.Decode.map2
            (\a b ->
                if a /= b then
                    Just a

                else
                    Nothing
            )
            (Json.Decode.at [ "target", "dataset", "groupId" ] Json.Decode.string)
            (Json.Decode.at [ "relatedTarget", "dataset", "groupId" ] Json.Decode.string)
        , Json.Decode.at [ "target", "dataset", "groupId" ] Json.Decode.string
            |> Json.Decode.andThen (\a -> Json.Decode.succeed (Just a))
        ]
        |> Json.Decode.andThen
            (\maybeChanged ->
                case maybeChanged of
                    Just a ->
                        Json.Decode.succeed (msg a)

                    Nothing ->
                        Json.Decode.fail "no change"
            ) 

Maintenant, nous pouvons créer un onGroupLoss écouteur :

onGroupFocusLoss msg =
    Html.Events.on "blur" (decodeGroupIdChanged msg)

Et faites comme ça :

input [onGroupFocusLoss GroupFocusLoss, groupIdAttribute "a"]

Voici un exemple (notez qu'il est construit avec elm-ui donc il y a un peu de code supplémentaire).

https://ellie-app.com/3nkBCXJqjQTa1

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X