如何在 运行 为特定指令设置函数之前 运行 影响所有相同类型指令的函数?

How to run a function that affects all directives of the same type before running a function for a specific directive?

我得到了一个显示小下拉菜单的菜单指令。不过,我对一件事有点迷茫,那就是如何确保一次只打开一个菜单。我想要 运行 所有菜单的 am.close 功能,然后 运行 我点击的菜单的 am.toggle 功能。

我该怎么做?

指令:

core.directive('amMenu', [function() {

  return {
    restrict: 'E',
    scope: {
      wrapper: '@',
      host: '=',
      options: '@'
    },
    templateUrl: './assets/angular/modules/core/directives/actions-menu/am-menu.html',
    controller: 'AmMenuCtrl',
    controllerAs: 'am',
    link: function(scope, element, attrs) {}
  };
}]);

控制器:

core.controller('AmMenuCtrl', [function() {

  var am = this;

  /--- some option arrays here ---/


  am.toggle = function() {
    am.isToggled = !am.isToggled;
  };

  am.close = function() {
    am.isToggled = false;
  };
}]);

模板:

<div class="am-menu-wrapper" click-outside on-outside="am.close" exceptions="['am-menu-wrapper']">
  <span class="am-toggle am-icon" ng-click="am.toggle()">
    <i class="icon icon-dots-horizontal"></i>
  </span>
  <ul class="am-menu" ng-class="{visible: am.isToggled}">
    <li class="am-item">
      <span class="pull-rights" ng-click="am.close()"><i class="icon icon-dots-horizontal"></i></span>
    </li>
    <li class="am-item" ng-repeat="option in am[options].options" ng-bind="option.label" ng-click="option.onClick(host, wrapper)"></li>
  </ul>
</div>

我想到了两个解决方案:

  1. 我认为你可以使用一个服务来存储所有指令的引用,当其中一个被点击时,对每个指令调用 am.close 并调用 am.toggle在点击的那个上。

  2. 不使用嵌套变量isToggled来控制下拉列表的状态,你可以使用'document.querySelectorAll('[am-menu]');'获取所有指令,并 add/remove css class 控制 open/closed 状态