2015-01-18 13 views
41

Mam element <div>, który ma inny element <div> jako dziecko.ng-kliknij na rodzic kliknięć przez dzieci

Dodałem dyrektywę ng-click do rodzica i spodziewam się, że nie zostanie zwolniony po kliknięciu na dziecko. Jednak tak się dzieje.

<div class="outer" ng-click="toggle()"> 
    <div class="inner">You can click through me</div> 
</div> 

Dlaczego to robi i jak mogę tego uniknąć?

Oto JSFiddle wykazania problem

Odpowiedz

76

musisz anulować propagacji zdarzenia, więc zdarzenie kliknięcia elementu nadrzędnego nie zostanie wywołana. Wypróbuj:

<div class="outer" ng-click="toggle()"> 
    <div class="inner" ng-click="$event.stopPropagation()">You can click through me</div> 
</div> 

Po kliknięciu elementu potomnego jego zdarzenie zostanie wyzwolone. Ale na tym się nie kończy. Najpierw wywoływane jest zdarzenie kliknięcia elementu podrzędnego, następnie wyzwalane jest zdarzenie kliknięcia elementu nadrzędnego i tak dalej. To się nazywa propagacja zdarzeń, Aby zatrzymać propagację zdarzeń (wyzwalanie zdarzeń kliknięcia dla rodziców), musisz użyć powyższej funkcji, stopPropagation.


Working example

dodałam trochę CSS dopełnienie, więc przykładem jest wyraźniejszy. Bez dopełnienia element potomny zajmuje całą wewnętrzną przestrzeń i nie można kliknąć elementu nadrzędnego bez kliknięcia elementu potomnego.

+0

jaki sposób '.outer' div jest klikalny jeśli nie ma nic, że tekst bezpośrednio insde. –

+0

Funkcja e.stopPropagation() powinna być używana w elemencie nadrzędnym, a nie w podrzędnej div, tak aby element potomny nie mógł mieć przypisanego zdarzenia kliknięcia .... –

+0

To prawda, dostosuję moją odpowiedź i dodaję przykład pracy. – itd

0

Jeśli chcesz ustawić różne funkcje dla rodzica i dziecka, możesz wysłać $ event jako parametr dla funkcji podrzędnej i stopPropagation wewnątrz niej. Tak:

<div class="outer" ng-click="onParentClick()"> 
    <div class="inner" ng-click="onChildClick($event)">You can click through me</div> 
</div> 

w kontrolerze:

function onChildClick(event){ 
    event.stopPropagation(); 
    //do stuff here... 
} 
function onParentClick(){ 
    //do stuff here.. 
} 
Powiązane problemy