8

Ich habe Anweisung, die so etwas wie dies tut:AngularJS: Wie stoppe ich die Ereignisausbreitung von ng-click?

app.directive('custom', function(){ 
    return { 
     restrict:'A', 
     link: function(scope, element){ 
      element.bind('click', function(){ 
       alert('want to prevent this'); 
      }); 

     } 
    } 
}); 

ja, es ist notwendig, jQuery-Wege-Bindung für diesen Fall zu tun.

Und jetzt möchte ich dieses Ereignis (Klick) zu stoppen, wenn eine Bedingung erfüllt.

zu tun versucht:

$event.stopPropagation(); 
    $event.preventDefault(); 

aber es hat nicht geholfen.

hier Geige zum Beispiel - http://jsfiddle.net/STEVER/5bfkbh7u/

+1

Was meinst du "ohne diese Richtlinie zu berühren"? Sie möchten, dass sich diese Direktive anders verhält - ohne ihren Code zu ändern? Wie mit Magie? –

+0

@James, du hast Recht. es ist ziemlich verwirrend. entfernt. –

Antwort

7

In Ihrem Fall können Sie die Propagierung nicht stoppen, da click -Ereignis auf demselben Element passiert, es gibt nur zwei verschiedene Handler.

Sie können jedoch die Tatsache nutzen, dass dies das gleiche Ereignisobjekt in beiden Controller ngClick und in Direktive ist. Also, was Sie tun können, ist eine Eigenschaft auf dieses Ereignis Objekt zu setzen und prüfen, ob es in der Richtlinie:

$scope.dosomething = function($event){ 
    $event.stopPropagation(); 
    $event.preventDefault(); 
    alert('here'); 

    if (someCondtion) { 
     $event.stopNextHandler = true; 
    } 
} 

und in Richtlinie:

link: function(scope, element){ 
    element.bind('click', function(e) { 
     if (e.stopNextHandler !== true) { 
      alert('want to prevent this');  
     } 
    });    
} 

Demo:http://jsfiddle.net/5bfkbh7u/6/

+0

netter Trick! :) aber ist es möglich, ohne dieses "if (! element [0] .stopEvent)" zu tun? –

+0

Ja, überprüfen Sie die Antwort von @ James Gaunt, das ist noch schlauer. – dfsq

+0

@STEVER Überprüfen Sie die neue Version, Sie können die Eigenschaft des Ereignisobjekts festlegen, ohne mit Elementen zu verfahren. – dfsq

0

gibt es nicht jede Ereignispropagierung hier, wie Sie Taste und Sie auf Ereignisse haben auf dem gleichen Element dieses nicht zu übergeordnete Element untergeordnetes Element gehen, dh kein Ereignis sprudeln oder Ereignis Capturing ist hier

+0

irgendwelche Vorschläge, wie man benutzerdefinierten Handler stoppt? –

0

Sie fügen beide Ereignisse an die Schaltfläche an. Überprüfen Sie das Element, wenn Sie das zweite Ereignis registrieren

<div ng-controller="mainCtrl" custom> 
    Hi! I'm the parent. 
    <button ng-click="dosomething($event)">BUTTON</button> 
</div> 

Showcase

+0

ist es Lösung? Sie haben nur die "benutzerdefinierte" Direktive entfernt –

+0

nein Ich habe versucht zu zeigen, warum Ihr Ereignis noch ausgelöst wird, auch wenn Sie die Verbreitung verhindern. das ist der Grund, warum ich dein "kundenspezifisches" Ereignis zu deinem tatsächlichen Elternteil anbrachte. –

+0

@STEVER, wenn Ihre Frage lautet: "Wie kann ich verhindern, dass ein zweites angehängtes Ereignis ausgelöst wird?" Dann werden Sie meist mit Check-Flag-Lösungen gehen. dfsq zur Verfügung gestellt –

1

Haben Sie senken versucht, die Priorität dieser Richtlinie sicherstellen, dass es nach der ng-Click-Richtlinie bindet? Ich gehe davon aus, dass die Ereignisse in der Reihenfolge ausgelöst werden, in der sie gebunden waren, was wiederum von der Priorität der ng-click-Anweisung gegenüber der Direktive bestimmt wird.

Sie benötigen auch stopImmediatePropagation, um zu verhindern, dass weitere Handler auf demselben Element ausgelöst werden. stopPropagation verhindert nur, dass das Ereignis an die übergeordneten Handler weitergegeben wird.

+0

Ich spielte mit Prioritäten, aber vielleicht war ich nicht richtig. beide Direktiven hat 0 Priorität, oder? –

+0

Ja ng-click tut, also würde ich Ihre -1 machen, um sicherzustellen, dass es danach ausgeführt wird, und stopImmediatePropagation anstelle von stopPropagation verwenden. Mit stopPropagation wird kein Ereignis für dasselbe Element ausgelöst. –

+0

nein, funktioniert nicht –

1
Use e.stopImmediatePropagation(); 
elem.bind('click', function (e) { 
    if (disable(scope)){ 
    e.stopImmediatePropagation(); 
    return false; 
    } 

    return true; 
}); 
+1

Würde erklären, warum 'stopPropagation' nicht funktioniert hat und warum Sie' stopImmediatePropagation' erwarten. Ich persönlich weiß es nicht. – apokryfos

+1

Während dieses Code-Snippet die Frage lösen kann, [hilft eine Erklärung] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) wirklich, um die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in der Zukunft beantworten, und diese Leute könnten die Gründe für Ihren Codevorschlag nicht kennen. - [Aus Bewertung] (https://stackoverflow.com/review/low-quality-posts/12789020) – Ferrybig

Verwandte Themen