javascript - Angular 6 - 单击外部菜单

标签 javascript jquery angular html typescript

我正在创建一个单击事件来记录关闭我的旁边菜单,我在 jquery 中创建了示例,但我不想在 jquery 中执行此操作,而且我无法访问“菜单”变量。

我怎样才能用纯 Angular 写这个?

import { Component, HostListener, ElementRef } from "@angular/core";
import { Router } from "../../node_modules/@angular/router";

@Component({
  selector: "app-root",
  templateUrl: "./app.component.html",
  styleUrls: ["./app.component.scss"]
})
export class AppComponent {
  menu: boolean;
  date = new Date();

  @HostListener('document:click', ['$event'])
  clickout(event) {
    if(this.eRef.nativeElement.contains(event.target)) {
      this.menu = false;
    } else {
      console.log('clicked outside');
    }
  }

  constructor(public router: Router,
              private eRef: ElementRef) {}

  showMenu() {
    this.menu = !this.menu;
  }


}

编辑 我编辑了重复的代码,但我有不同的想法

是否有其他 HostListener 可以忽略旁边和带有 id 的按钮?还是我想错了?

当我点击旁边或按钮菜单时,此点击事件不能正常工作,当我点击其他任何地方时,它应该将我的 this.menu 设置为 false。

<aside id="aside" [hidden]="!menu">
  <button class="menu-btn" (click)="menu = false" routerLink="/">Strona Główna</button>
  <button (click)="menu = false" routerLink="/cv">CV</button>
  <button (click)="menu = false" routerLink="/bio">BIO</button>
  <button (click)="menu = false" routerLink="/portfolio">Portfolio</button>
  <button (click)="menu = false" routerLink="/kontakt">Kontakt</button>
</aside>
<button id="menu-btn" [class.aside]="menu" (click)="showMenu()">Klik</button>

最佳答案

this answer 中的建议,您可以使用 HostListener 检测文档 click 事件。要确保单击菜单时鼠标单击不会到达文档,您应该在 aside 元素上设置的 click 事件处理程序中停止事件的传播:

<aside [hidden]="!menu" (click)="handleAsideClick($event)">
@HostListener('document:click', ['$event']) clickout(event) {
  // Click outside of the menu was detected
  ...
}

handleAsideClick(event: Event) {
  event.stopPropagation(); // Stop the propagation to prevent reaching document
  ...
}

关于javascript - Angular 6 - 单击外部菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51616574/

相关文章:

node.js - 是否有任何快速工具可以在不删除 JavaScript 源代码注释的情况下执行常量替换?

javascript - 带有 Phaser.io : High speed, Sprite 的 HTML5 游戏不会发生碰撞

jquery - 有人可以帮我使用 livestream 的 api 发出跨域 xml 请求吗?

javascript - 使用 nivoSlider,如何确定当前幻灯片图像或索引?

css - Angular 2 将渐变视为不安全

javascript - JS - 将数组或字符串转换为参数列表 [SQLite insert with bind parameters]

javascript - 在对象内部的数组上使用的 ng-repeat 重复等于对象元素的数量?

javascript - jQuery中防止每个img都受到影响

javascript - Angular - 从 'then' 内部返回值

html - 主页中的背景图像不起作用?