微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

添加一个确认对话框作为向按钮添加的属性指令

如何解决添加一个确认对话框作为向按钮添加的属性指令

我使用 angular11 来编写我的项目

在很多情况下,我想要一个按钮有一个确认对话框,所以我想创建一个指令,当添加到按钮元素时,它会显示一个弹出窗口,而不是为它创建一个 mat-dialog 弹出窗口带有是/否按钮的自定义消息,只有当用户单击是时,才会执行实际的单击事件。

所以现在我只是想禁用点击事件,看看系统是否工作..但它没有:)点击事件仍然被执行。

这是我的指令:

import {Directive,ElementRef} from '@angular/core';

@Directive({
  selector: '[comTuxinConfirm]'
})
export class TuxConfirmDirective {

  constructor(el: ElementRef) {
    el.nativeElement.addEventListener('click',this.clickEventHandler);
  }

  clickEventHandler(e: MouseEvent): boolean {
      e.preventDefault();
      e.stopPropagation();
      return false;
  }

}

这就是我使用它的方式:

    <button *ngIf="actionLabel" comTuxinConfirm mat-button (click)="onActionClicked()">{{actionLabel}}</button>

在调试时,我看到 comTuxinConfirm 的事件处理程序首先执行,在 onActionClicked() 之前,但它仍然继续执行实际操作。

这里存在某种竞争条件,因为如果我创建断点和两个位置,它就会停止。所以我想这不是正确的方法

任何想法如何正确实施?

谢谢

解决方法

它必须是点击事件吗?如果必须如此,您可以尝试使用在单击之前触发的 mousedown 事件来阻止它。但是如果你想正确地实现这一点,你可能应该使用一个 observable。

您的按钮看起来像这样:

    <button comTuxinConfirm mat-button (onOk)="onActionClicked()">{{actionLabel}}</button>

还有你的指令:

export class TuxConfirmDirectiveDirective {
  @Output() onOk = new Subject<void>();

  constructor(private dialog: MatDialog) {}

  @HostListener("click")
  click(e: MouseEvent): void {
    this.dialog.open(MyDialogComponent).afterClosed().subscribe(r => this.onOk.next());
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。