我有一个表行点击事件,并在此行中也有一个删除按钮与一个Click事件。 当我点击删除按钮在该行的Click事件也被解雇。
这里是我的代码。
<tbody>
<tr ng-repeat="user in users" class="repeat-animation" ng-click="showUser(user, $index)">
<td>{{user.firstname}}</td>
<td>{{user.lastname}}</td>
<td>{{user.email}}</td>
<td><button class="btn red btn-sm" ng-click="deleteUser(user.id, $index)">Delete</button></td>
</tr>
</tbody>
我怎样才能防止出现showUser
当我点击表格单元的删除按钮会触发事件?
ngClick指令(以及其他所有事件指令)创建$event
变量,它可以用相同的范围内。 这个变量是JS基准event
对象,并且可以用来调用stopPropagation()
<table>
<tr ng-repeat="user in users" ng-click="showUser(user)">
<td>{{user.firstname}}</td>
<td>{{user.lastname}}</td>
<td>
<button class="btn" ng-click="deleteUser(user.id, $index); $event.stopPropagation();">
Delete
</button>
</td>
</tr>
</table>
PLUNKER
一个除了的Stewie的答案。 如果当你的回调决定传播是否应停止与否,我认为有必要通过$event
对象的回调:
<div ng-click="parentHandler($event)">
<div ng-click="childHandler($event)">
</div>
</div>
然后在回调本身,你可以决定该事件的传播是否应停止:
$scope.childHandler = function ($event) {
if (wanna_stop_it()) {
$event.stopPropagation();
}
...
};
我写了一个指令,它可以限制其中一个点击都有影响的区域。 它可用于某些情况下像这样的,所以不是不必处理按个别情况下,你只能说点击“点击不会来此元素的出来”。
你会使用这样的:
<table>
<tr ng-repeat="user in users" ng-click="showUser(user)">
<td>{{user.firstname}}</td>
<td>{{user.lastname}}</td>
<td isolate-click>
<button class="btn" ng-click="deleteUser(user.id, $index);">
Delete
</button>
</td>
</tr>
</table>
请记住,这将阻止所有点击的最后一个单元格,不只是按钮。 如果这不是你想要的,你可能想换按钮是这样的:
<span isolate-click>
<button class="btn" ng-click="deleteUser(user.id, $index);">
Delete
</button>
</span>
下面是该指令的代码:
angular.module('awesome', []).directive('isolateClick', function() {
return {
link: function(scope, elem) {
elem.on('click', function(e){
e.stopPropagation();
});
}
};
});
在您使用一个指令像我这样的情况下,这是如何工作的,当你需要两个数据在任何模型或集合更新的属性后,例如双向绑定:
angular.module('yourApp').directive('setSurveyInEditionMode', setSurveyInEditionMode)
function setSurveyInEditionMode() {
return {
restrict: 'A',
link: function(scope, element, $attributes) {
element.on('click', function(event){
event.stopPropagation();
// In order to work with stopPropagation and two data way binding
// if you don't use scope.$apply in my case the model is not updated in the view when I click on the element that has my directive
scope.$apply(function () {
scope.mySurvey.inEditionMode = true;
console.log('inside the directive')
});
});
}
}
}
现在,你可以很容易地在任何按钮,链接,DIV等,像这样使用它:
<button set-survey-in-edition-mode >Edit survey</button>
<ul class="col col-double clearfix">
<li class="col__item" ng-repeat="location in searchLocations">
<label>
<input type="checkbox" ng-click="onLocationSelectionClicked($event)" checklist-model="selectedAuctions.locations" checklist-value="location.code" checklist-change="auctionSelectionChanged()" id="{{location.code}}"> {{location.displayName}}
</label>
$scope.onLocationSelectionClicked = function($event) {
if($scope.limitSelectionCountTo && $scope.selectedAuctions.locations.length == $scope.limitSelectionCountTo) {
$event.currentTarget.checked=false;
}
};