Вот пример. Допустим, я хочу, чтобы изображение было наложено, как на многих сайтах. Поэтому, когда вы щелкаете по миниатюре, над всем окном появляется черный оверлей, и в нем центрируется увеличенная версия изображения. Щелчок по черному наложению отклоняет его; щелчок по изображению вызовет функцию, которая показывает следующее изображение.
HTML:
<div ng-controller="OverlayCtrl" class="overlay" ng-click="hideOverlay()">
<img src="http://some_src" ng-click="nextImage()"/>
</div>
Javascript:
function OverlayCtrl($scope) {
$scope.hideOverlay = function() {
// Some code to hdie the overlay
}
$scope.nextImage = function() {
// Some code to find and display the next image
}
}
Проблема в том, что при такой настройке, если щелкнуть изображение, оба nextImage()
и hideOverlay()
вызываются. Но я хочу, чтобы меня только nextImage()
называли.
Я знаю, что вы можете захватить и отменить событие в nextImage()
функции, как это:
if (window.event) {
window.event.stopPropagation();
}
... Но я хочу знать, есть ли лучший способ сделать это на AngularJS, который бы не требовал от меня добавления этого кода ко всем функциям элементов внутри оверлея.
return false
в конце функцииonclick
, а неng-click
.Ответы:
Что сказал @JosephSilber, или передайте объект $ event в
ng-click
callback и остановите распространение внутри него:источник
Используйте
$event.stopPropagation()
:Вот демонстрация: http://plnkr.co/edit/3Pp3NFbGxy30srl8OBmQ?p=preview
источник
ReferenceError: $event is not defined
в консоли.$event.stopPropagation()
в место, где это не работает. Забыл удалить это. Так что даже когда я положил его там, где он работал, его снова вызывали там, где он не работал. Избавился от неисправного дубликата, и это успешно. Спасибо за вашу помощь.Мне нравится идея использования директивы для этого:
Затем используйте директиву как:
Если вы хотите, вы можете сделать это решение более общим, как этот ответ на другой вопрос: https://stackoverflow.com/a/14547223/347216
источник
stop-event
атрибут html? Я не смог найти его ни в Mozilla Developer Network, ни где-либо еще.angular-eat-event
директиву по беседке, которая работает аналогичным образом!Иногда может иметь смысл сделать это:
Я решил сделать это таким образом, потому что я не хотел
myClickHandler()
останавливать распространение события во многих других местах, где оно использовалось.Конечно, я мог бы добавить логический параметр в функцию-обработчик, но
stopPropagation()
он гораздо важнее, чем простоtrue
.источник
$event.stopPropagation()
к внутренним элементам.checkbox
завернул вdiv
элемент. Мойdiv
принимает 12 столбцов иcheckbox
, скажем, 3 столбца. Я хотел вызвать функциюA
по щелчкуdiv
и функциюB
по щелчкуcheckbox
. поэтому, когда я нажимал,checkbox
обе функции вызывались. Когда я добавляюng-click="$event.stopPropagation()"
кcheckbox
, я получаю только функциюB
вызванную .stopPropagation()
том, чтобы остановить событие, распространяющееся на родительские элементы. Я не знаю , как ты называешь ,B
так как это не specififed вng-click
, но суть ответа заключается в том, что вы можете сделать это:<checkbox ng-click="B(); $event.stopPropagation()">
. Вам не нужно включатьstopPropagation()
функцию вB
.Это работает для меня:
источник
Если вы не хотите добавлять остановку распространения ко всем ссылкам, это также работает. Чуть более масштабируемый.
источник
event.target.classList.indexOf('overlay')
И этот трюк отлично работает, даже если div вложен в другие divЕсли вы вставите ng-click = "$ event.stopPropagation" в родительский элемент вашего шаблона, то stopPropogation будет перехвачен, поскольку он всплывает в дереве, поэтому вы должны написать его только один раз для всего шаблона.
источник
Вы можете зарегистрировать другую директиву,
ng-click
которая изменяет поведение по умолчаниюng-click
и останавливает распространение события. Таким образом, вам не придется добавлять$event.stopPropagation
вручную.источник
Использование контроллера IN
источник