Two nested click events with angularjs

后端 未结 3 502
独厮守ぢ
独厮守ぢ 2020-12-25 09:17

I have a HTML structure like this:

相关标签:
3条回答
  • 2020-12-25 09:58

    Same as tom's answer, but little different.

            <div ng-click="test()">
                <div id="myId" ng-click="test2($event)">child</div>
            </div>
    
            $scope.test2 =function($event){
                $event.stopPropagation();
                console.log("from test2")
            }
            $scope.test =function(){
                console.log("from test")
            }
    
    0 讨论(0)
  • 2020-12-25 10:15

    Here is a directive based on another question which supports ng-href links.

    Directive

    'use strict';
    
    
    var myApp = angular.module('myApp', [
        'ngAnimate'
      ]);
    
    /**
     * @ngdoc directive
     * @name myMobileApp.directive:stopEvent
     * @description Allow normal ng-href links in a list where each list element itselve has an ng-click attached.
     */
    angular.module('myApp')
      .directive('stopEvent', function($location, $rootScope) {
        return {
          restrict: 'A',
          link: function(scope, element) {
            element.bind('click', function(event) {
    
            // other ng-click handlers shouldn't be triggered
            event.stopPropagation(event);
            if(element && element[0] && element[0].href && element[0].pathname) {
              // don't normaly open links as it would create a reload.
              event.preventDefault(event);
              $rootScope.$apply(function() {
                $location.path( element[0].pathname );
              });
            }
          });
          }
        };
      })
    
    
    .controller('TestCtrl', ['$rootScope', '$scope', 'Profile', '$location', '$http', '$log',
      function($rootScope, $scope, Profile, $location, $http, $log) {
        $scope.profiles = [{'a':1,'b':2},{'a':3,'b':3}];
    
        $scope.goToURL = function(path, $event) {
          $event.stopPropagation($event);
          $location.path(path);
        };
    
      }
    ]);
    
      <div ng-repeat="x in profiles" 
         ng-click="goToURL('/profiles/' + x.a, $event)">
    
          <a stop-event ng-href="/profiles/{{x.b}}">{{x}}</a>
    
      </div>
    
    0 讨论(0)
  • 2020-12-25 10:20

    All you need to do is to stop event propagation/bubbling.

    This code will help you:

    <div ng-click="test()">ZZZZZ
        <div id="myId" ng-click="test2();$event.stopPropagation()">XXXXX</div>
        <div>YYYYYY</div>
        ...
    </div>
    

    If your test and test2 functions would look as follows, you would get only test2 in your console when clicking on myId DIV. Without $event.stopPropagation() you would get test2 followed by test in the console output window.

    $scope.test = function() {
        console.info('test');
    }
    $scope.test2 = function() {
        console.info('test2');
    }
    
    0 讨论(0)
提交回复
热议问题