【发布时间】:2013-08-24 18:23:44
【问题描述】:
我想覆盖指令 ng-click: 在每次执行 ng-click 之前进行一些 $rootscope 更改。怎么做?
【问题讨论】:
标签: angularjs angularjs-directive angularjs-ng-click
我想覆盖指令 ng-click: 在每次执行 ng-click 之前进行一些 $rootscope 更改。怎么做?
【问题讨论】:
标签: angularjs angularjs-directive angularjs-ng-click
每个指令都是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');
});
}
}
});
查看http://plnkr.co/edit/U2nlcA?p=preview
我写了一个示例,删除了内置的角度 ng-click 并添加了自定义的 ngClick
【讨论】:
click 绑定已经在另一个函数回调中使用 element.bind 完成:github.com/angular/angular.js/blob/master/src/ng/directive/…
你不能覆盖 AngularJS 的内置指令。但是,您可以定义多个具有相同名称的指令,并让它们针对同一个元素执行。通过为您的指令分配适当的priority,您可以控制您的指令是在内置指令之前还是之后运行。
这个plunker 展示了如何构建一个在内置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>
script.js
angular.module('app', [])
.directive('ngClick', function($rootScope) {
return {
restrict: 'A',
priority: 100, // give it higher priority than built-in ng-click
link: function(scope, element, attr) {
element.bind('click', function() {
// do something with $rootScope here, as your question asks for that
alert('overridden');
})
}
}
})
.controller('MyCtrl', function($scope) {
$scope.alert = function() {
alert('built-in!')
}
})
【讨论】: