我想覆蓋指令ng-click:在每次執行ng-click之前,有些人做一些$ rootcope更改。怎麼做?AngularJS - 如何覆蓋指令ngClick
回答
您不能覆蓋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 我寫了取出的樣品角內置ng-click
並添加自定義ngClick
這對我非常有幫助!謝謝。 –
你將如何保持這兩個委託,但讓第一個處理程序有條件地傳播到內置委託? –
@AlexWhite我的猜測是,這是不可能的,因爲'click'綁定已經在另一個函數回調中用'element.bind'完成了:https://github.com/angular/angular.js/blob/master/src/ ng/directive/ngEventDirs.js #L62 – saiyancoder
- 1. 如何覆蓋angularjs指令ngInclude
- 2. ngClick在指令
- 3. AngularJS指令 - 單元測試噶覆蓋
- 4. AngularJS覆蓋隔離指令範圍
- 5. AngularJS覆蓋指令控制器功能
- 6. 覆蓋或阻止AngularJS指令
- 7. AngularJS自定義輸入指令。覆蓋默認輸入指令
- 8. ngClick指令上的$ window
- 9. AngularJS - 如何覆蓋$ urlRouterProvider.when
- 10. AngularJS指令用ngClick函數替換標籤
- 11. 在指令中更改NgModel屬性覆蓋所有範圍angularJs
- 12. 如何angularjs指令
- 13. AngularJS:我如何在我的視圖中覆蓋指令的樣式?
- 14. 在指令如何可以編譯範圍ngClick上ngRepeat
- 15. 角ui路由器覆蓋指令
- 16. 創建點擊覆蓋指令視圖
- 17. 如何在angularjs中正確覆蓋exceptionHandler?
- 18. 如何覆蓋angularjs中的$ http對象
- 19. 如何測試AngularJS指令
- 20. 如何angularjs本指令
- 21. 如何使angularjs表指令
- 22. Angularjs如何在指令
- 23. AngularJS如何編譯指令?
- 24. 如何在angularjs指令
- 25. 如何使ngReact使用ng指令(ngClick,ngStyle等)
- 26. angular.js:如何將ngclick從原始dom傳遞到指令的dom?
- 27. 如何覆蓋指令中的圖像源
- 28. 如何防止NG-模型覆蓋由指令
- 29. 如何覆蓋ng-click指令不自動運行$ apply
- 30. aws cloudwatch指標覆蓋/覆蓋
非常感謝詳細的回答) – Simcha
布歐,我們可以完全停止第一次ng-click嗎?我的意思是在運行'重寫'提醒後,'內置'不運行。 –
不要將表達式傳遞給ng-click,請參閱http://plnkr.co/edit/uROkIcGKLspLnVsjmAKn?p=preview。如果你必須通過s/t,那麼不要處理它,例如$ scope.alert = function(){}。 –