Volevo solo condividere qualcosa con te.
Ho avuto dei momenti difficili con ng-mouseenter
ed ng-mouseleave
eventi.
Il caso di studio:
Ho creato un menu di navigazione mobile che si attiva quando il cursore si trova su un'icona.
Questo menu era in cima a ogni pagina.
- Per gestire mostra / nascondi nel menu, seleziono una classe.
ng-class="{down: vm.isHover}"
- Per attivare vm.isHover , utilizzo gli eventi del mouse di ng.
ng-mouseenter="vm.isHover = true"
ng-mouseleave="vm.isHover = false"
Per ora, tutto è andato bene e ha funzionato come previsto.
La soluzione è pulita e semplice.
Il problema in arrivo:
In una vista specifica, ho un elenco di elementi.
Ho aggiunto un pannello azioni quando il cursore si trova su un elemento dell'elenco.
Ho usato lo stesso codice di cui sopra per gestire il comportamento.
Il problema:
Ho capito quando il mio cursore si trova nel menu di navigazione mobile e anche nella parte superiore di un elemento, c'è un conflitto tra loro.
Viene visualizzato il pannello azioni e la navigazione mobile è nascosta.
Il fatto è che anche se il cursore si trova sul menu di navigazione mobile, viene attivato l'elemento elenco ng-mouseenter.
Non ha senso per me, perché mi aspetterei un'interruzione automatica degli eventi di propagazione del mouse.
Devo dire che sono rimasto deluso e dedico un po 'di tempo a scoprire quel problema.
Primi pensieri:
Ho provato a usare questi:
$event.stopPropagation()
$event.stopImmediatePropagation()
Ho combinato molti eventi puntatore (mousemove, mouveover, ...) ma nessuno mi aiuta.
Soluzione CSS:
Ho trovato la soluzione con una semplice proprietà CSS che utilizzo sempre di più:
pointer-events: none;
Fondamentalmente, lo uso così (sugli elementi della mia lista):
ng-style="{'pointer-events': vm.isHover ? 'none' : ''}"
Con questo difficile, gli eventi di ng-mouse non verranno più attivati e il mio menu di navigazione mobile non si chiuderà più quando il cursore si trova sopra di esso e sopra un elemento dell'elenco.
Andare oltre:
Come ci si può aspettare, questa soluzione funziona ma non mi piace.
Non controlliamo i nostri eventi ed è un male.
Inoltre, è necessario avere un accesso vm.isHover
all'ambito per raggiungere questo obiettivo e potrebbe non essere possibile o possibile ma sporco in un modo o nell'altro.
Potrei fare un violino se qualcuno vuole guardare.
Tuttavia, non ho un'altra soluzione ...
È una lunga storia e non posso darti una patata, quindi per favore perdonami amico mio.
Comunque, pointer-events: none
è la vita, quindi ricordalo.