次の例では:
_ <li ng-repeat="item in items" ng-click="showItem(item)">
<h3>{{item.title}}</h3>
<button ng-click="remove(item)">Remove</button>
</li>
_
ボタンをクリックすると、イベントバブリングのためshowItem()
も呼び出されます。 _$event
_を使用して_$event.currentTarget
_を監視し、$event.stopPropagation()
などを実行できることを知っていますが、これは非常にいです。
ところでbutton
での伝播を停止したくない(私の場合、button
は_Twitter bootstrap
_ _dopdown/button
_です-これは単なる例です)
remove
ボタンをクリックしたときにshowItem()
が呼び出されないようにするにはどうすればよいですか?
[〜#〜] edit [〜#〜] ugい修正は次のようにすることです:
_function remove(item,$event){
$event.originalEvent.prevent = true;
// rest of the code
}
function showItem(item,$event){
if($event.originalEvent.prevent)return;
// rest of the code
}
_
この解決策は私のために働いた(私は最近のブラウザのみをサポートしているので、よりレトロな互換性を持つようにコードを修正しようとした):
HTML:
<li ng-repeat="item in items" ng-click="showItem(item)">
<h3>{{item.title}}</h3>
<button ng-click="remove(item, $event)">Remove</button>
</li>
スクリプト:
function remove(item, $event) {
// do some code here
// Prevent bubbling to showItem.
// On recent browsers, only $event.stopPropagation() is needed
if ($event.stopPropagation) $event.stopPropagation();
if ($event.preventDefault) $event.preventDefault();
$event.cancelBubble = true;
$event.returnValue = false;
}
function showItem(item) {
// code here
}
[〜#〜] edit [〜#〜]-JSFiddleデモを追加して試してみました http://jsfiddle.net/ 24e7mapp/1 /
showItem
は、item
で渡されたものがもう存在しない場合、早期に戻るように更新できます。
function remove(item) {
if (-1 == $scope.items.indexOf(item)) {
// Item no longer exists, return early
return;
}
// Rest of code here
}