2017-04-26 124 views
2

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

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; 
     }); 
    } 
} 

确认框确实出现,但事件在它之前被触发,所以它没用。我希望这个指令能够阻止一个事件的发生,如果这个动作被确认了就会触发它,否则就取消它。

+0

为什么没用? –

+0

因为无论我确认与否,事件总是被触发。 – yenerunver

+0

OMG Angular 4发布了吗?什么在做:O:O角3在哪里? –

回答

2

实际上,你可以结合指令名和输出在一起。

<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() 
    } 
    }); 
} 
} 
+0

我的问题仍然没有解决。你的代码中的delete()事件没有被解雇@Julia – yenerunver

+0

你可以创建一个plunker,所以我可以看到它为什么不起作用? –

+0

我创建了一个Plunker,但它工作大声笑。 https://plnkr.co/edit/J1GMyfGLx4bJ3e9hfXz3。然后我应该重新调试我的代码。 – yenerunver

6

我会解决它是这样的:

@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

+0

哇,很好的解决方案! –

+0

感谢您的帮助,但我们有一个小问题。它不运行的功能,即使我用这样的: yenerunver

+0

https://plnkr.co/edit/IFLiJHNY4OShirxQqGtg?p=preview – yurzui