Angular ngClickバブルとデフォルトの動作を阻止
7868 ワード
これは実は簡単な問題で、Angular公式のAPIドキュメントを真剣に見たことがあるなら、もともと記録したくないです.しかし、この問題は一度も聞かれたことがないので、今日はここに記録しています.
Angularでは、ngClick、ngBlur、ngCopy、ngCut、ngDblclickなどのngイベントに$eventという変数が追加されています.
ngClickの公式ドキュメントでは、次のように記述されています.
AngularコードngEventDirs.jsを表示します.
jsコード:
jsbin](http://jsbin.com/delow/3/watch?html,js,output)で効果を表示できます.
まずコンソールを開きますが、Stop Propagationが選択されていない場合はbuttonをクリックすると2つのlogレコードが表示され、逆に選択するとbuttonのlog情報しか表示されません.
このような質問はもうしないでください.
Angularでは、ngClick、ngBlur、ngCopy、ngCut、ngDblclickなどのngイベントに$eventという変数が追加されています.
ngClickの公式ドキュメントでは、次のように記述されています.
Expression to evaluate upon click. (Event object is available as $event)
AngularコードngEventDirs.jsを表示します.
var ngEventDirectives = {};
forEach(
'click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste'.split(' '),
function(name) {
var directiveName = directiveNormalize('ng-' + name);
ngEventDirectives[directiveName] = ['$parse', function($parse) {
return {
compile: function($element, attr) {
var fn = $parse(attr[directiveName]);
return function(scope, element, attr) {
element.on(lowercase(name), function(event) {
scope.$apply(function() {
fn(scope, {$event:event});
});
});
};
}
};
}];
}
);
在上边代码我们可以得到两个信息:
- Angular支持的event: click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste
- Angular在执行事件函数时候传入了一个名叫$event的常量,该常量即代表当前event对象,如果你在Angular之前引入了jQuery那么这就是jQuery的event.
所以我们可以利用event的stopPropagation来阻止事件的冒泡:如下代码:jsbin
html 代码:
<!DOCTYPE html>
<html id="ng-app" ng-app="app">
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.1.5/angular.min.js"></script>
<meta charset="utf-8">
<title>JS Bin</title>
</head>
<body ng-controller="demo as d">
<div ng-click="d.click('parent',$event)">
given some text for click
<hr>
<input type="checkbox" ng-model="d.stopPropagation" />Stop Propagation ?
<hr>
<button type="button" ng-click="d.click('button',$event)">button</button>
</div>
</body>
</html>
jsコード:
angular.module("app",[])
.controller("demo",[function(){
var vm = this;
vm.click = function(name,$event){
console.log(name +" -----called");
if(vm.stopPropagation){
$event.stopPropagation();
}
};
return vm;
}]);
jsbin](http://jsbin.com/delow/3/watch?html,js,output)で効果を表示できます.
まずコンソールを開きますが、Stop Propagationが選択されていない場合はbuttonをクリックすると2つのlogレコードが表示され、逆に選択するとbuttonのlog情報しか表示されません.
このような質問はもうしないでください.