【问题标题】:Angular 4 Confirm DirectiveAngular 4 确认指令
【发布时间】:2017-04-26 11:06:22
【问题描述】:

我正在尝试在 Angular 4 中为 jQuery Confirm 创建一个指令。但是,我很难阻止绑定事件的发生。这是我的结构:

menus.component.html:

<a (click)="delete(menu)" class="btn" confirm><i class="icon-trash"></i></a>

menus.component.ts:

delete(menu: Menu): void {
    this.menuService.delete(menu.id)
        .subscribe(
            error =>  this.errorMessage = <any>error);
}

confirm.directive.ts:

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

@Directive({ selector: '[confirm]' })
export class ConfirmDirective {
    constructor(el: ElementRef) {
        $(el.nativeElement).on('click', function () {
            $(this).confirm({
                confirm: function () {
                    return true;
                }
            });

            return false;
        });
    }
}

确实出现了确认框,但是在它之前触发了事件,所以它没有用。我希望该指令停止触发事件,如果确认操作则触发它,否则取消它。

【问题讨论】:

  • 为什么没用?
  • 因为无论我确认与否,都会触发事件。
  • OMG Angular 4 发布了吗?在做什么 :O :O 角度 3 在哪里?
  • @RameshRajendran 他们跳过了 3。现在也只是“Angular”,当前的稳定版本是 v4.0.0。 6 个月后,将是 v5.0.0。
  • 因为 this.router.navigate(['/menus']);总是在你初始化你的模式后被执行。您应该只在订阅结果中导航(点击 smt 后)

标签: angular angular-directive jquery-confirm


【解决方案1】:

您实际上可以将指令名称和输出组合在一起。

 <button class="btn" (confirm)="delete()">delete</button>

 @Directive({
   selector: '[confirm]'
 }) 
 export class ConfirmDirective {
   @Output() confirm = new EventEmitter<any>();

   constructor(private el: ElementRef) {
   }

   @HostListener('click')
    onClick() {
      $.confirm({
      buttons: {
     confirm: () => this.confirm.emit()
   }
  });
 }
}

【讨论】:

  • 我的问题还没有解决。代码中的 delete() 事件不会被触发@Julia
  • 你可以创建一个 plunker,这样我就知道为什么它不起作用了?
  • 我创建了一个 Plunker,但它可以工作,哈哈。 plnkr.co/edit/J1GMyfGLx4bJ3e9hfXz3。那我应该重新调试我的代码。
  • 好。让我知道我可以如何帮助您。
  • 事实证明,整个问题是由我过时的 jQuery Confirm 库引起的。您的指令效果很好,再次感谢。
【解决方案2】:

我会这样解决它:

@Directive({ 
  selector: '[confirm]' 
})
export class ConfirmDirective {

  @Output('confirm-click') click: any = new EventEmitter();

  @HostListener('click', ['$event']) clicked(e) {
    $.confirm({
      buttons: {
        confirm: () => this.click.emit(),
        cancel: () => {}
      }
    });
  }

}

您的 html 应如下所示:

<a (confirm-click)="delete(menu)" class="btn" confirm>Delete</a>

Plunker Example

【讨论】:

  • 哇,不错的解决方案!
  • 感谢您的帮助,但我们有一个小问题。即使我这样使用它也不会运行该功能:
  • @yurzui 我举了 alert(1) 的例子,只是为了简单。我的代码中缺少某些东西,我不知道是什么,但它不会让您建议的代码工作。
  • 阅读 angular2 中的模板变量作用域。我将警报作为属性添加到组件
  • 既然我的函数在一个组件中,我应该把它称为 (confirm-click)="menuService.delete(menu)" 还是什么?
猜你喜欢
  • 2014-04-02
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 2018-04-11
  • 2015-07-16
  • 1970-01-01
  • 2018-04-17
  • 2018-04-12
相关资源
最近更新 更多