Aqui está um exemplo. Digamos que eu queira ter uma sobreposição de imagem como muitos sites. Portanto, quando você clica em uma miniatura, uma sobreposição preta aparece sobre toda a janela e uma versão maior da imagem é centralizada nela. Clicar na sobreposição preta a dispensa; clicar na imagem chama uma função que mostra a próxima imagem.
O html:
<div ng-controller="OverlayCtrl" class="overlay" ng-click="hideOverlay()">
<img src="http://some_src" ng-click="nextImage()"/>
</div>
O 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
}
}
O problema é que, com esta configuração, se você clicar na imagem, tanto nextImage()
e hideOverlay()
são chamados. Mas o que eu quero é que apenas nextImage()
seja chamado.
Eu sei que você pode capturar e cancelar o evento na nextImage()
função assim:
if (window.event) {
window.event.stopPropagation();
}
... Mas quero saber se existe uma maneira melhor de fazer o AngularJS que não exija que eu prefixe todas as funções nos elementos dentro da sobreposição com esse trecho.
return false
no final da funçãoonclick
, nãong-click
.Respostas:
O que o @JosephSilber disse, ou passe o objeto $ event para o
ng-click
retorno de chamada e interrompa a propagação dentro dele:fonte
Use
$event.stopPropagation()
:Aqui está uma demonstração: http://plnkr.co/edit/3Pp3NFbGxy30srl8OBmQ?p=preview
fonte
ReferenceError: $event is not defined
no console.$event.stopPropagation()
em um lugar onde não funcionasse. Esqueceu de removê-lo. Então, mesmo quando eu o coloquei onde funcionava, estava sendo chamado pela segunda vez onde não funcionava. Livre-se da duplicata disfuncional e é bem-sucedida. Obrigado pela ajuda.Eu gosto da ideia de usar uma diretiva para isso:
Em seguida, use a diretiva como:
Se você quiser, poderá tornar esta solução mais genérica como esta, para uma pergunta diferente: https://stackoverflow.com/a/14547223/347216
fonte
stop-event
um atributo html? Não consegui encontrá-lo na Mozilla Developer Network ou em qualquer outro lugar.angular-eat-event
diretiva sobre pavilhão, que funciona de maneira semelhante!Às vezes, pode fazer mais sentido apenas fazer isso:
Eu escolhi fazê-lo dessa maneira, porque não queria
myClickHandler()
interromper a propagação de eventos nos muitos outros lugares em que ele era usado.Claro, eu poderia ter adicionado um parâmetro booleano à função manipulador, mas
stopPropagation()
é muito mais significativo do que apenastrue
.fonte
$event.stopPropagation()
aos elementos internos.checkbox
envolto emdiv
elemento. Meudiv
está tomando 12 colunas echeckbox
está tomando digamos 3 colunas. Eu queria chamar uma funçãoA
no clique dediv
e funçãoB
no clique decheckbox
. então, quando eu estava clicando, ascheckbox
duas funções estavam sendo invocadas. Quando eu adicionong-click="$event.stopPropagation()"
acheckbox
, eu só tenho funcionamB
invocado.stopPropagation()
é interromper a propagação do evento para elementos pai. Eu não sei como você está chamandoB
uma vez que não está specififed emng-click
, mas o ponto da resposta é que você pode fazer isso:<checkbox ng-click="B(); $event.stopPropagation()">
. Você não tem de incluir astopPropagation()
função emB
.Isso funciona para mim:
fonte
Se você não deseja adicionar a interrupção da propagação a todos os links, isso também funciona. Um pouco mais escalável.
fonte
event.target.classList.indexOf('overlay')
E esse truque funciona bem mesmo quando o div está aninhado em outros divsSe você inserir ng-click = "$ event.stopPropagation" no elemento pai do seu modelo, o stopPropogation será capturado à medida que borbulha na árvore, portanto, você deve gravá-lo apenas uma vez para todo o modelo.
fonte
Você pode registrar outra diretiva em cima da
ng-click
qual altera o comportamento padrãong-click
e para a propagação de eventos. Dessa forma, você não precisaria adicionar$event.stopPropagation
à mão.fonte
Uso do controlador IN
fonte