Angular 7:单击外部时关闭菜单

时间:2019-04-01 09:45:19

标签: javascript angular angular7

我想知道在父div #menu内触发点击时,其中存在不相关的html标签。

nativeElement.parent不适用于我。

HTML代码:

<button #toggleButton (click)="toggleMenu()"> Toggle Menu</button>

 <div class="menu" *ngIf="isMenuOpen" #menu>
    <div>
      I'm the menu. Click outside to close me
    </div>
    </div>

角度脚本:

this.renderer.listen('window', 'click',(e:Event)=>{

        if(e.target !== this.toggleButton.nativeElement && e.target!==this.menu.nativeElement){
            this.isMenuOpen=false;
        }
    });

这不起作用。

2 个答案:

答案 0 :(得分:2)

将主机添加到组件元标记。

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
  host: {
    "(window:click)": "onClick()"
  }
})

stopPropagation()

  

事件接口的stopPropagation()方法可防止进一步   在捕获和冒泡阶段传播当前事件。

toggleMenu($event) {    
    $event.stopPropagation();
    this.isMenuOpen = !this.isMenuOpen;
  }

  onClick() {
    this.isMenuOpen = false;
  }

示例:https://stackblitz.com/edit/angular-oenkbw

答案 1 :(得分:1)

您可以通过侦听文档单击事件来重置菜单状态,在这种情况下,菜单中的任何单击事件都需要运行事件stopPropagation方法以防止文档单击方法,最后,菜单组件主体中的所有单击都转到了由你处理 菜单组件resetToggle之外的所有click事件都将运行。

  

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