angular - 停止点击的指令不工作 Angular 2

标签 angular

当在点击事件上使用 HostListener 并试图停止该事件的传播时,实际元素上的点击处理程序仍然会触发。

这里是相关代码和一个 stackblitz 作为例子。

// Directive
@Directive({
  selector: '[appDirective]'
})
export class AppDirective {
  @HostListener('click', ['$event']) onClick($event: Event) {
    $event.preventDefault();
    $event.stopPropagation();
    alert('i tried to prevent this...');
  }
}

// HTML
<button (click)="doSomething()" appDirective>Click Me</button>

// Click handler
@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {
  name = 'Angular 6';

  doSomething() {
    alert('I was not prevented.');
  }
}

我做错了什么吗?

https://angular-nufbqg.stackblitz.io

最佳答案

你弄错了,你的代码确实有效。

  1. 没有类型的按钮的默认操作是什么??没有! (click) 调用下的方法不是浏览器的默认操作。
  2. 你正试图阻止传播? DOM 链上面没有点击事件的监听器,同一个元素中有一个处理程序。所以停止传播是没有用的。

您可以根据需要解决您的问题。比如说,您必须在单击按钮时提交表单。然后 submit 按钮类型的默认操作将是提交表单。 preventDefault() 将在那里工作。

<form (ngSubmit)="doSomething()">
  <button type="submit" appDirective>Click Me</button>
</form>


export class AppDirective {
  @HostListener('click', ['$event']) onClick($event: Event) {
    console.log("host listener called"); // will be called
    $event.preventDefault();
  }
}


doSomething() {
   console.log("do Something called");   // won't be called
}

https://stackblitz.com/edit/angular-kdajrk

关于angular - 停止点击的指令不工作 Angular 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51613321/

相关文章:

javascript - 隐藏在可滚动表格标题中的下拉值 - Primeng

javascript - innerHTML 不适用于某些标签,例如按钮或自定义标签

Angular2 : Should Host listeners be unsubscibed? HoSTListener 是如何工作的?如果我不必退订,什么时候退订?

javascript - Angular 4 + Http 在 Cordova 中未进行垃圾收集

angular - 如何通过 POST 请求将用户重定向到外部站点

angular - 如何将代码片段放入 Angular 5 *.component.html

javascript - 如何将 String[] 传递给我的 angular2 html 模板

angular - 忽略 .gitignore 中名为 npm-debug.log.XXXXXX 的文件

angular - 如何全局处理错误?

angular - 如何在 Angular 模板中迭代联合类型数组