Chciałem tylko się z tobą czymś podzielić.
Trudno mi było z wydarzeniami ng-mouseenter
i ng-mouseleave
wydarzeniami.
Studium przypadku:
Stworzyłem pływające menu nawigacyjne, które jest przełączane, gdy kursor znajduje się nad ikoną.
To menu znajdowało się na górze każdej strony.
- Aby obsłużyć wyświetlanie / ukrywanie w menu, przełączam klasę.
ng-class="{down: vm.isHover}"
- Aby przełączyć vm.isHover , używam zdarzeń myszy ng.
ng-mouseenter="vm.isHover = true"
ng-mouseleave="vm.isHover = false"
Na razie wszystko było w porządku i działało zgodnie z oczekiwaniami.
Rozwiązanie jest czyste i proste.
Nadchodzący problem:
W konkretnym widoku mam listę elementów.
Dodałem panel akcji, gdy kursor znajduje się nad elementem listy.
Użyłem tego samego kodu co powyżej do obsługi zachowania.
Problem:
Zorientowałem się, że kiedy mój kursor znajduje się w pływającym menu nawigacyjnym, a także na górze elementu, występuje między sobą konflikt.
Pojawił się panel akcji, a pływająca nawigacja została ukryta.
Chodzi o to, że nawet jeśli kursor znajduje się nad pływającym menu nawigacyjnym, uruchamiany jest element listy ng-mouseenter.
Nie ma to dla mnie sensu, bo spodziewałbym się automatycznej przerwy w propagacji myszy.
Muszę powiedzieć, że byłem rozczarowany i spędziłem trochę czasu, aby dowiedzieć się tego problemu.
Pierwsze myśli:
Próbowałem użyć tych:
$event.stopPropagation()
$event.stopImmediatePropagation()
Połączyłem wiele zdarzeń wskaźnikowych (mousemove, mouveover, ...), ale żadne mi nie pomogło.
Rozwiązanie CSS:
Znalazłem rozwiązanie z prostą właściwością css, której używam coraz częściej:
pointer-events: none;
Zasadniczo używam tego w ten sposób (na mojej liście elementów):
ng-style="{'pointer-events': vm.isHover ? 'none' : ''}"
W tym trudnym przypadku zdarzenia ng-mouse nie będą już wyzwalane, a moje pływające menu nawigacyjne nie będzie się już zamykać, gdy kursor znajdzie się nad nim i nad elementem z listy.
Iść dalej:
Jak można się spodziewać, to rozwiązanie działa, ale mi się nie podoba.
Nie kontrolujemy naszych wydarzeń i jest źle.
Ponadto musisz mieć dostęp do vm.isHover
lunety, aby to osiągnąć i może to być niemożliwe lub niemożliwe, ale w jakiś sposób brudne.
Mógłbym zrobić skrzypce, gdyby ktoś chciał spojrzeć.
Nie mam jednak innego rozwiązania ...
To długa historia i nie mogę ci dać ziemniaka, więc wybacz mi przyjacielu.
W każdym razie pointer-events: none
jest życie, więc pamiętaj o tym.