私はディレクティブng-click:をオーバーライドしたいのですが、ng-clickを実行する前に$ rootscopeをいくつか変更します。どうやってするの?
AngularJS組み込みディレクティブをオーバーライドすることはできません。ただし、同じ名前の複数のディレクティブを定義して、同じ要素に対して実行させることができます。適切なpriority
をディレクティブに割り当てることにより、ディレクティブを組み込みディレクティブの前または後に実行するかどうかを制御できます。
この plunker は、ng-click
ディレクティブは、組み込みのng-click
します。コードも以下に示します。リンクをクリックすると、カスタムng-click
が最初に実行され、次に組み込みのng-click
します。
index.html
<!DOCTYPE html>
<html ng-app="app">
<head>
<script data-require="[email protected]" data-semver="1.9.0" src="//cdnjs.cloudflare.com/ajax/libs/jquery/1.9.0/jquery.js"></script>
<script data-require="[email protected]" 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!')
}
})
すべてのディレクティブは、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;
}]);
});
角度は、同じ名前の複数のディレクティブをサポートしているため、独自の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 angular built-in ng-click
およびカスタマイズされたngClick
を追加します