AngularJS-如何覆盖指令ngClick

AngularJS-如何覆盖指令ngClick,angularjs,angularjs-directive,angularjs-ng-click,Angularjs,Angularjs Directive,Angularjs Ng Click,我想重写指令ng click:在每次执行ng click之前,对某些命令进行一些$rootscope更改。如何执行?您不能覆盖AngularJS内置指令。但是,您可以使用相同的名称定义多个指令,并对同一元素执行它们。通过为指令指定适当的优先级,您可以控制指令是在内置指令之前还是之后运行 这显示了如何构建在内置的ng click执行之前执行的ng click指令。代码如下所示。单击链接时,将首先运行自定义的ng click,然后运行内置的ng click index.html <!DOCTY

我想重写指令ng click:在每次执行ng click之前,对某些命令进行一些$rootscope更改。如何执行?

您不能覆盖AngularJS内置指令。但是,您可以使用相同的名称定义多个指令,并对同一元素执行它们。通过为指令指定适当的
优先级
,您可以控制指令是在内置指令之前还是之后运行

这显示了如何构建在内置的
ng click
执行之前执行的
ng click
指令。代码如下所示。单击链接时,将首先运行自定义的
ng click
,然后运行内置的
ng click

index.html

<!DOCTYPE html>
<html ng-app="app">

  <head>
    <script data-require="jquery@1.9.0" data-semver="1.9.0" src="//cdnjs.cloudflare.com/ajax/libs/jquery/1.9.0/jquery.js"></script>
    <script data-require="angular.js@1.0.7" data-semver="1.0.7" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.js"></script>
    <script src="script.js"></script>
  </head>

  <body ng-controller="MyCtrl">
    <a ng-click="alert()">Click me</a>
  </body>

</html>

每个指令都是AngularJS中的特殊服务,您可以覆盖或修改AngularJS中的任何服务,包括指令

例如,删除内置的
ngClick

angular.module('yourmodule',[]).config(function($provide){
    $provide.decorator('ngClickDirective', ['$delegate', function($delegate) {
        //$delegate is array of all ng-click directive
        //in this case first one is angular buildin ng-click
        //so we remove it.
        $delegate.shift();
        return $delegate;
    }]);
});
angular支持多个指向同一名称的指令,因此您可以注册自己的
ngClick
指令

angular.module('yourmodule',[]).directive('ngClick',function (){
  return {
    restrict : 'A',
    replace : false,
    link : function(scope,el,attrs){
      el.bind('click',function(e){
        alert('do you feeling lucky');
      });
    }
  }
});
退房
我写了一个示例,删除了angular内置的
ng click
,并添加了一个定制的
ngClick

,非常感谢您的详细回复)Buu,我们可以完全停止第一次ng click吗?我的意思是在运行“重写”警报后,“内置”将不运行。不要将表达式传递给ng click,请参阅。如果必须通过s/t,则不要处理它,例如$scope.alert=function(){}。这不是正确答案,请检查下面的Eric Chen!同意JackNova的观点,这个答案是不正确的。*您可以覆盖/替换所有指令,如@eric chen在下面所示*此示例方法将遇到问题-同一元素上不能有多个指令请求隔离范围或设置模板。Eric的方法解决了tooThis对我的巨大帮助!谢谢。您如何保留两个委托,但让第一个处理程序有条件地传播到内置委托?@AlexWhite我猜这是不可能的,因为
单击
绑定是用
元素完成的。bind
已经在另一个函数回调中:@AlexWhite简单的解决方案是通过在指令中复制ngClick事件处理程序和$parse用法,并从事件处理程序有条件地调用它。
angular.module('yourmodule',[]).config(function($provide){
    $provide.decorator('ngClickDirective', ['$delegate', function($delegate) {
        //$delegate is array of all ng-click directive
        //in this case first one is angular buildin ng-click
        //so we remove it.
        $delegate.shift();
        return $delegate;
    }]);
});