您可以通过侦听文档单击事件来重置菜单状态,在这种情况下,菜单中的任何单击事件都需要运行事件stopPropagationmethod 以阻止文档单击方法,最后菜单组件主体中的任何单击都由处理你
并且菜单组件resetToggle 之外的任何点击事件都会运行。
stopPropagation 阻止文档点击处理程序运行
menuItemClickHandler(e , index ) {
e.stopPropagation();
// something magical ?♂️✨
...
}
@HostListener("document:click") resetToggle() {
this.isMenuOpen=false;
}
菜单组件
export class MenusComponent {
menuslist = [1, 2, 3, 4, 5, 6, 7, 8];
@HostBinding('class.active') isMenuOpen: boolean = false;
constructor() { }
menuItemClickHandler(e, index) {
e.stopPropagation();
// something magical ?♂️✨
console.log(index);
this.toggle(e); // toggle menus after you click ?
}
// component click
@HostListener('click', ['$event']) click(e) {
e.stopPropagation();
}
@HostListener("document:click") resetToggle() {
this.isMenuOpen = false;
}
toggle(e) {
e.stopPropagation();
console.log('toggle')
this.isMenuOpen = !this.isMenuOpen;
}
}
菜单组件模板
<ul ngClass="{slide : isMenuOpen}">
<li *ngFor="let item of menuslist;let index=index" (click)="menuItemClickHandler($event,index)">
{{item}}
</li>
</ul>
菜单样式将根据菜单的打开值切换菜单以打开或关闭滑动
:host {
display: block;
height: 50vh;
width: 200px;
background: #ccc;
margin-left: -300px;
transition: all 0.25s ease-in-out;
}
:host.active{
margin-left: 0
}
stackblitz demo ??