Angular指令两次触发事件

问题描述 投票:0回答:1

我正在创建一个滑入式指令以显示一些选项。标题中有3个按钮,即“返回”,“取消全选”和“应用”。现在,当我单击任何按钮时,都会触发两次“ click”事件。请看下面的代码。

HTML:

<aside class="search-filter-slide fullheight search-filter ng-hide">
        <div class="search-filter-by clearfix row" id="searchFiltersAction">
            <button class="btn btn-sm btn-info pull-left" id="searchFilterBackBtn">Back</button>
            <button class="btn btn-sm btn-link" id="deselectAllFilters">deselect all</button>
            <button class="btn btn-sm btn-primary pull-right" id="applyFiltersBtn">Apply</button>
        </div>
</aside>

指令:

angular.module('MyAppObj')
.directive('searchFilter', [function () {
  return {
      restrict: 'CA',
      link: function (scope, element, attrs) {
          $(document).on('click','#searchFilterBtn.search-filter-btn',function(e){
              e.stopPropagation();
              $(element).removeClass('ng-hide');
              setTimeout(function () { $(element).addClass('slide-in'); }, 200);
          });

          $(document).on('click','#searchFiltersAction #searchFilterBackBtn',function(e){
              e.stopPropagation();
              console.log('Closing the open filters view...',e.target.tagName)
              $(element).removeClass('slide-in');
              setTimeout(function () { $(element).addClass('ng-hide'); }, 500);
          });

          $(document).on('click','#searchFiltersAction #deselectAllFilters',function(e){
              e.stopPropagation();
              console.log('Deselect all selected filters...')
          });

          $(document).on('click','#searchFiltersAction #applyFiltersBtn',function(e){
              e.stopPropagation();
              console.log('Apply selected filters to the search results...')
          });
      }
  };
}]);
jquery angularjs angularjs-directive event-handling jquery-events
1个回答
0
投票

我已经成功解决了这个问题。回答我的问题,这样可以对某人有所帮助:

更新的指令代码:

angular.module('MyAppObj')
.directive('searchFilter', [function () {
    function link(scope, element, attrs){
        $(document).on('click','#searchFilterBtn.search-filter-btn',function(e){
              e.stopPropagation();
              $(element).removeClass('ng-hide');
              setTimeout(function () { $(element).addClass('slide-in'); }, 200);
          });

          $(document).on('click','#searchFiltersAction #searchFilterBackBtn',function(e){
              e.stopPropagation();
              console.log('Closing the open filters view...',e.target.tagName)
              $(element).removeClass('slide-in');
              setTimeout(function () { $(element).addClass('ng-hide'); }, 500);
          });

          $(document).on('click','#searchFiltersAction #deselectAllFilters',function(e){
              e.stopPropagation();
              console.log('Deselect all selected filters...')
          });

          $(document).on('click','#searchFiltersAction #applyFiltersBtn',function(e){
              e.stopPropagation();
              console.log('Apply selected filters to the search results...')
          });

          var cleanup = function(){
            $(document).off('click','#searchFilterBtn.search-filter-btn');
            $(document).off('click','#searchFiltersAction #searchFilterBackBtn');
            $(document).off('click','#searchFiltersAction #deselectAllFilters');
            $(document).off('click','#searchFiltersAction #applyFiltersBtn');
          }

          scope.$on('$destroy',cleanup)
    }
  return {
      restrict: 'CA',
      link: link
  };
 }]);
© www.soinside.com 2019 - 2024. All rights reserved.