AngularJS dropdown directive hide when clicking outside

后端 未结 9 2127
长发绾君心
长发绾君心 2020-11-29 22:06

I\'m trying to create a multiselect dropdown list with checkbox and filter option. I\'m trying to get the list hidden with I click outside but could not figure it out how. A

9条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-11-29 23:05

    I realized it by listening for a global click event like so:

    .directive('globalEvents', ['News', function(News) {
        // Used for global events
        return function(scope, element) {
            // Listens for a mouse click
            // Need to close drop down menus
            element.bind('click', function(e) {
                News.setClick(e.target);
            });
        }
    }])
    

    The event itself is then broadcasted via a News service

    angular.factory('News', ['$rootScope', function($rootScope) {
        var news = {};
        news.setClick = function( target ) {
            this.clickTarget = target;
            $rootScope.$broadcast('click');
        };
    }]);
    

    You can then listen for the broadcast anywhere you need to. Here is an example directive:

    .directive('dropdown', ['News', function(News) {
      // Drop down menu für the logo button
      return {
        restrict: 'E',
        scope: {},
        link: function(scope, element) {
          var opened = true;
          // Toggles the visibility of the drop down menu
          scope.toggle = function() {
            element.removeClass(opened ? 'closed' : 'opened');
            element.addClass(opened ? 'opened' : 'closed');
          };
          // Listens for the global click event broad-casted by the News service
          scope.$on('click', function() {
            if (element.find(News.clickTarget.tagName)[0] !== News.clickTarget) {
              scope.toggle(false);
            }
          });
          // Init
          scope.toggle();
        }
      }
    }])
    

    I hope it helps!

提交回复
热议问题