ng-click上的确认对话框 - AngularJS

poi*_*rez 84 javascript angularjs angularjs-directive angularjs-scope

我正在尝试ng-click使用自定义angularjs指令设置确认对话框:

app.directive('ngConfirmClick', [
    function(){
        return {
            priority: 1,
            terminal: true,
            link: function (scope, element, attr) {
                var msg = attr.ngConfirmClick || "Are you sure?";
                var clickAction = attr.ngClick;
                element.bind('click',function (event) {
                    if ( window.confirm(msg) ) {
                        scope.$eval(clickAction)
                    }
                });
            }
        };
}])
Run Code Online (Sandbox Code Playgroud)

这很好但很遗憾,使用我的指令在标记内的表达式不会被评估:

<button ng-click="sayHi()" ng-confirm-click="Would you like to say hi?">Say hi to {{ name }}</button>
Run Code Online (Sandbox Code Playgroud)

(这种情况下不评估名称).这似乎是由于我的指令的终端参数.你对解决方法有什么想法吗?

测试我的代码:http: //plnkr.co/edit/EHmRpfwsgSfEFVMgRLgj?p = preview

mik*_*kel 92

如果您不介意不使用ng-click,它可以正常工作.您可以将其重命名为其他内容并仍然读取该属性,同时避免点击处理程序被触发两次问题.

http://plnkr.co/edit/YWr6o2?p=preview

我认为问题是terminal指示其他指令不运行.数据绑定{{ }}只是ng-bind指令的别名,可能会被取消terminal.

  • 此代码段不再适用于当前版本的角度.范围.$ eval(..)应该用范围替换.$ apply(..) (13认同)

mik*_*rgh 56

一种干净的指令方法.

更新:旧答案(2014)

它基本上拦截ng-click事件,显示ng-confirm-click="message"指令中包含的消息并要求用户确认.如果单击确认ng-click,则执行正常操作,否则脚本将终止并且ng-click不会运行.

<!-- index.html -->
<button ng-click="publish()" ng-confirm-click="You are about to overwrite your PUBLISHED content!! Are you SURE you want to publish?">
  Publish
</button>
Run Code Online (Sandbox Code Playgroud)
// /app/directives/ng-confirm-click.js
Directives.directive('ngConfirmClick', [
  function(){
    return {
      priority: -1,
      restrict: 'A',
      link: function(scope, element, attrs){
        element.bind('click', function(e){
          var message = attrs.ngConfirmClick;
          // confirm() requires jQuery
          if(message && !confirm(message)){
            e.stopImmediatePropagation();
            e.preventDefault();
          }
        });
      }
    }
  }
]);
Run Code Online (Sandbox Code Playgroud)

Zach Snow的代码信用:http://zachsnow.com/#!/ blog/13/confirming-ng-click /

更新:新答案(2016)

1)将前缀从"ng"更改为"mw",因为前者('ng')保留用于本机角度指令.

2)修改指令传递函数和消息而不是拦截ng-click事件.

3)添加默认"你确定吗?" 如果未向mw-confirm-click-message =""提供自定义消息,则显示消息.

<!-- index.html -->
<button mw-confirm-click="publish()" mw-confirm-click-message="You are about to overwrite your PUBLISHED content!! Are you SURE you want to publish?">
  Publish
</button>
Run Code Online (Sandbox Code Playgroud)
// /app/directives/mw-confirm-click.js
"use strict";

var module = angular.module( "myApp" );
module.directive( "mwConfirmClick", [
  function( ) {
    return {
      priority: -1,
      restrict: 'A',
      scope: { confirmFunction: "&mwConfirmClick" },
      link: function( scope, element, attrs ){
        element.bind( 'click', function( e ){
          // message defaults to "Are you sure?"
          var message = attrs.mwConfirmClickMessage ? attrs.mwConfirmClickMessage : "Are you sure?";
          // confirm() requires jQuery
          if( confirm( message ) ) {
            scope.confirmFunction();
          }
        });
      }
    }
  }
]);
Run Code Online (Sandbox Code Playgroud)

  • Nb,需要jQuery (8认同)

Kai*_*las 46

对我来说,https://www.w3schools.com/js/js_popup.asp,浏览器的默认确认对话框工作得很好.刚试过这个:

$scope.delete = function() {
    if (confirm("sure to delete")) {
        // todo code for deletion
    }
};
Run Code Online (Sandbox Code Playgroud)

简单.. :)
但我认为你无法自定义它.它将显示"取消"或"确定"按钮.

编辑:

如果您使用离子框架,则需要使用ionicPopup对话框,如下所示:

// A confirm dialog


$scope.showConfirm = function() {
   var confirmPopup = $ionicPopup.confirm({
     title: 'Delete',
     template: 'Are you sure you want to delete this item?'
   });

   confirmPopup.then(function(res) {
     if(res) {
       // Code to be executed on pressing ok or positive response
       // Something like remove item from list
     } else {
       // Code to be executed on pressing cancel or negative response
     }
   });
 };
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅:$ ionicPopup


VBM*_*ali 10

它使用核心javascript + angular js如此简单:

$scope.delete = function(id) 
    { 
       if (confirm("Are you sure?"))
           {
                //do your process of delete using angular js.
           }
   }
Run Code Online (Sandbox Code Playgroud)

如果单击"确定",则将执行删除操作,否则不会.*id是要删除的参数,记录.


小智 5

您不想使用,terminal: false因为这是阻止按钮内部处理的内容.相反,在您link清除时attr.ngClick要防止默认行为.

http://plnkr.co/edit/EySy8wpeQ02UHGPBAIvg?p=preview

app.directive('ngConfirmClick', [
  function() {
    return {
      priority: 1,
      link: function(scope, element, attr) {
        var msg = attr.ngConfirmClick || "Are you sure?";
        var clickAction = attr.ngClick;
        attr.ngClick = "";
        element.bind('click', function(event) {
          if (window.confirm(msg)) {
            scope.$eval(clickAction)
          }
        });
      }
    };
  }
]);
Run Code Online (Sandbox Code Playgroud)