- Вы должны использовать
mouseenter
и mouseleave
вместо ваших событий, чтобы они не срабатывали на вложенных тегах.
- Я бы предложил создать Observable открытости, используя RxJ's
fromEvent
и объединяя все ваши события в одно boolean
.
Здесь я сделал стекаблитц, чтобы вы показали, что я имею в виду под этим:
https://stackblitz.com/edit/angular-4ntjhm?file=src%2Fapp%2Fhello.component.ts
Наблюдаемая часть:
const mouseenter$ = fromEvent(nativeElement, 'mouseenter');
const mouseleave$ = fromEvent(nativeElement, 'mouseleave');
const click$ = fromEvent(nativeElement, 'click');
this.open$ = merge(
mouseenter$.pipe(mapTo(true)),
mouseleave$.pipe(mapTo(false)),
click$.pipe(mapTo(null)),
).pipe(
scan((acc, current) => current === null ? !acc : current, false),
startWith(false),
distinctUntilChanged(),
);
В основном вы отображаете ввод в true и оставляете в false, и при нажатии вы переключаете предыдущее значение.