Je voulais juste partager quelque chose avec vous.
J'ai eu du mal avec ng-mouseenter
et les ng-mouseleave
événements.
L'étude de cas:
J'ai créé un menu de navigation flottant qui bascule lorsque le curseur se trouve sur une icône.
Ce menu était en haut de chaque page.
- Pour gérer afficher / masquer dans le menu, je bascule une classe.
ng-class="{down: vm.isHover}"
- Pour basculer vm.isHover , j'utilise les événements de souris ng.
ng-mouseenter="vm.isHover = true"
ng-mouseleave="vm.isHover = false"
Pour l'instant, tout allait bien et fonctionnait comme prévu.
La solution est propre et simple.
Le problème entrant:
Dans une vue spécifique, j'ai une liste d'éléments.
J'ai ajouté un panneau d'action lorsque le curseur est sur un élément de la liste.
J'ai utilisé le même code que ci-dessus pour gérer le comportement.
Le problème:
J'ai compris que lorsque mon curseur est sur le menu de navigation flottant et également en haut d'un élément, il y a un conflit entre eux.
Le panneau d'action est apparu et la navigation flottante était masquée.
Le fait est que même si le curseur se trouve sur le menu de navigation flottant, l'élément de liste ng-mouseenter est déclenché.
Cela n'a aucun sens pour moi, car je m'attendrais à une interruption automatique des événements de propagation de la souris.
Je dois dire que j'ai été déçu et que je passe du temps à découvrir ce problème.
Premières réflexions:
J'ai essayé d'utiliser ceux-ci:
$event.stopPropagation()
$event.stopImmediatePropagation()
J'ai combiné beaucoup d'événements de pointeurs ng (mousemove, mouveover, ...) mais aucun ne m'aide.
Solution CSS:
J'ai trouvé la solution avec une simple propriété css que j'utilise de plus en plus:
pointer-events: none;
En gros, je l'utilise comme ça (sur mes éléments de liste):
ng-style="{'pointer-events': vm.isHover ? 'none' : ''}"
Avec celui-ci délicat, les événements ng-mouse ne seront plus déclenchés et mon menu de navigation flottant ne se fermera plus lorsque le curseur sera dessus et sur un élément de la liste.
Pour aller plus loin:
Comme vous vous en doutez, cette solution fonctionne mais je ne l'aime pas.
Nous ne contrôlons pas nos événements et c'est mauvais.
De plus, vous devez avoir accès à la vm.isHover
portée pour y parvenir et cela peut ne pas être possible ou possible mais sale d'une manière ou d'une autre.
Je pourrais faire un violon si quelqu'un veut regarder.
Néanmoins, je n'ai pas d'autre solution ...
C'est une longue histoire et je ne peux pas vous donner une pomme de terre alors pardonnez-moi mon ami.
Quoi qu'il en soit, pointer-events: none
c'est la vie, alors souvenez-vous-en.