Eu só queria compartilhar algo com você.
Eu tenho algum tempo duro com ng-mouseenter
e ng-mouseleave
eventos.
O estudo de caso:
Criei um menu de navegação flutuante que é alternado quando o cursor está sobre um ícone.
Este menu estava no topo de cada página.
- Para lidar com mostrar / ocultar no menu, alterno uma classe.
ng-class="{down: vm.isHover}"
- Para alternar vm.isHover , eu uso os eventos do mouse ng.
ng-mouseenter="vm.isHover = true"
ng-mouseleave="vm.isHover = false"
Por enquanto, estava tudo bem e funcionou como esperado.
A solução é limpa e simples.
O problema de entrada:
Em uma visão específica, eu tenho uma lista de elementos.
Eu adicionei um painel de ação quando o cursor está sobre um elemento da lista.
Eu usei o mesmo código acima para lidar com o comportamento.
O problema:
Eu descobri que quando meu cursor está no menu de navegação flutuante e também na parte superior de um elemento, há um conflito entre eles.
O painel de ação apareceu e a navegação flutuante foi ocultada.
O fato é que, mesmo que o cursor esteja sobre o menu de navegação flutuante, o elemento da lista ng-mouseenter é acionado.
Não faz sentido para mim, porque eu esperaria uma interrupção automática dos eventos de propagação do mouse.
Devo dizer que fiquei desapontado e passo algum tempo para descobrir esse problema.
Primeiras reflexões:
Eu tentei usar estes:
$event.stopPropagation()
$event.stopImmediatePropagation()
Combinei muitos eventos de ponteiro ng (movimento, movimentação, ...), mas nenhum me ajudou.
Solução CSS:
Encontrei a solução com uma propriedade css simples que uso cada vez mais:
pointer-events: none;
Basicamente, eu uso assim (nos elementos da minha lista):
ng-style="{'pointer-events': vm.isHover ? 'none' : ''}"
Com este complicado, os eventos do ng-mouse não serão mais acionados e meu menu de navegação flutuante não se fechará mais quando o cursor estiver sobre ele e sobre um elemento da lista.
Ir além:
Como você pode esperar, esta solução funciona, mas eu não gosto.
Nós não controlamos nossos eventos e isso é ruim.
Além disso, você deve ter acesso ao vm.isHover
escopo para isso e pode não ser possível ou possível, mas sujo de uma maneira ou de outra.
Eu poderia mexer se alguém quiser olhar.
No entanto, não tenho outra solução ...
É uma longa história e não posso lhe dar uma batata, por favor, perdoe-me, meu amigo.
Enfim, pointer-events: none
é vida, então lembre-se.