angularjs - 在 AngularJs 中装饰 ng-click 指令

标签 angularjs angularjs-directive decorator angularjs-ng-click

我一直在研究修改 AngularJS ng-click 指令以添加一些附加功能。我对它的用途有几个不同的想法,但一个简单的想法是将 Google Analytics 跟踪添加到所有 ng-clicks,另一个是防止双击。

为此,我的第一个想法是使用装饰器。所以是这样的:

app.config(['$provide', function($provide) {
  $provide.decorator('ngClickDirective', ['$delegate', function($delegate) {
    // Trigger Google Analytics tracking here
    return $delegate;
  }]);
}]);

但这不起作用,因为装饰器是在实例化时触发的,而不是在满足指令中的表达式时。因此,在这种情况下,它会在加载带有指令的元素时进行分析,而不是在单击元素时进行分析。

所以到了真正的问题。装饰器是否有某种方法可以获取指令实例化的元素?如果我可以从委托(delegate)中获得元素,我可以在其上绑定(bind)我自己的点击事件以触发除 ng-click 之外。

如果没有,您将如何在所有 ng-click 上添加一些内容?

最佳答案

您当然可以使用装饰器来添加功能。我做了一个快速plunkr演示如何。基本上,在您的装饰器主体中,您将 compile 函数替换为您自己的自定义逻辑(在示例中,如果 track 属性存在,则绑定(bind)到 click 事件),然后调用原始 compile 函数。这是片段:

$provide.decorator('ngClickDirective', function($delegate) {
  var original = $delegate[0].compile;
  $delegate[0].compile = function(element, attrs, transclude) {
    if(attrs.track !== undefined) {
      element.bind('click', function() {
        console.log('Tracking this');
      });
    }
    return original(element, attrs, transclude);
  };
  return $delegate;
})

关于angularjs - 在 AngularJs 中装饰 ng-click 指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18335574/

相关文章:

javascript - 如何处理 AngularJS 中禁用的 JavaScript

javascript - Angular 1.5 组件宿主元素属性

javascript - Angular-js : ng-repeat on a select element with a attribute directive

javascript - 使用 angularjs,如何根据同一表单中另一个输入标签的状态动态地将输入标签添加到表单中

typescript - NestJS测试: decorator is not a function

javascript - 无法交换两个数组的对象内的对象

javascript - 在 ng-repeat 中使用选择值

javascript - 用于显示输入错误的 AngularJS 表单验证指令

c++ - GoF 装饰器模式在 C++ 中使用静态多态性(模板)

typescript - 如何为属性创建 TypeScript @enumerable(false) 装饰器