2

我想做的事:

我正在尝试在可以从$rootScope.


问题:

它似乎只在处理 DOM 中具有此指令的最后一项。我猜rootScope.myFunction每次运行该指令时都会覆盖正在发生的事情。


问题:

如何在$rootScope其中创建一个函数,当调用该函数时,它会为每个指令运行内部函数,而不仅仅是最后一个?


相关代码:

(function() {
  angular.module('home')
    .directive('closeBar', closeBar);

  closeBar.$inject = ['$rootScope', '$window'];
  function closeBar(rootScope, window) {
    return {
      scope: true,
      restrict: 'A',
      link: function(scope, element, attrs) {

        var myFunction = function() {
          // do stuff
        };

        myFunction();

        rootScope.myFunction = function() {
          myFunction();
        };
      }
    };
  }
})();

然后在另一个脚本中,我想调用:

rootScope.myFunction();

请注意,我不允许分享我正在处理的项目中的实际代码,所以这是一个更普遍的问题,与特定用例无关。

4

1 回答 1

1

一个简单的解决方案是在 rootScope 中创建一个特殊函数,该函数接受函数作为参数,并将其推送到数组中,稍后您将能够调用该函数,该函数将调用所有已注册的函数。

 angular.module('myApp').run(['$rootScope', function($root) {
      var functionsToCall = [];
      $root.registerDirectiveFunction = function(fn, context) {
          context = context || window;
          functionsToCall.push({fn: fn, context: context});
      }
      $root.myFunction = function(args) {
          functionsToCall.forEach(function(fnObj) {
              fnObj.fn.apply(fnObj.context,args);
          });
      }
 }

在你的指令中:

 link: function($scope, $el, $attr) {
      function myFunct() {
      }
      $scope.$root.registerDirectiveFunction(myFunct, $scope);
      //call it if you want
      $scope.$root.myFunction();
 }

这应该涵盖您的情况。

于 2014-10-30T22:00:09.067 回答