如何在 angularjs 的 for 循环中动态创建 $rootScope.$on 事件侦听器

How to dynamically create $rootScope.$on event listeners in a for loop in angularjs

我想在 angularjs 服务中动态创建事件监听器,但是似乎我在服务的 for 循环中创建的每个 $rootScope.$on 事件监听器都被以下事件侦听器。我如何动态创建 $rootScope.$on even 监听器而不覆盖以前的事件监听器?我使用来自控制器的广播创建事件,例如 $rootScope.$broadcast(EVENTS.userDeleteSuccess.event);.

我的 EVENTS 常数看起来像:

myApp.constant('EVENTS', {
    userDeleteSuccess: {
        event: 'user-delete-success',
        type: 'success',
        message: 'User successfully deleted'
    },
    ...,
    siteDeleteSuccess: {
        event: 'site-delete-success',
        type: 'success',
        message: 'Site successfully deleted'
    }
}

我的服务是这样的:

myApp.service("Alert", function($rootScope, EVENTS) {

    var show = function(type, message) {

        $rootScope.alert = {
            type: type,
            message: message,
            show: true
        };
    };

    // Initialized on application startup, this is the problem method!

    this.initialize = function() {
        for(var event in EVENTS) {
          if(!EVENTS.hasOwnProperty(event)) break;
          var _event = EVENTS[event];
          $rootScope.$on(_event.event, function() {
            show(_event.type, _event.message);
          });
        }
      };

      return this;
});

唯一被广播的事件始终是对象中的最后一个事件(在本例中为 siteDeleteSuccess)。如何在不覆盖先前 $rootScope.$on 事件侦听器的 for 循环中动态创建事件侦听器?

您可以使用 IIFE 做两件事,或者只绑定参数以便将它们传递给函数

IIFE

(function(event){
    $rootScope.$on(event.event, function() {
        show(event.type, event.message);
    });
})(_event);

绑定:

$rootScope.$on(_event, function(event) {
    show(event.type, event.message);
}.bind(null,_event));

bind docs