如何拦截angular.js中的所有$ rootScope。$ broadcast事件

时间:2015-04-01 19:49:49

标签: angularjs events

我可能会有多个$rootScope.$broadcast事件影响一个视图元素。我想有一个分层函数来决定哪个事件优先于影响视图。

我的问题是,如何在$broadcast上收听所有$rootScope个事件?是否有某种事件拦截器?

3 个答案:

答案 0 :(得分:9)

我正在寻找同样问题的解决方案。在https://github.com/angular/angular.js/issues/6043遇到了caitp的解决方案,我相信这也是你所寻找的。

这样做的好处是,您可以将其保留在开发中,而不是将其包含在生产代码中,而无需更改应用程序中的任何逻辑。

我会从链接中复制代码以进行后代,并进行微调(以使用当前版本的角度):

app.config(function($provide) {
    $provide.decorator("$rootScope", function($delegate) {
    var Scope = $delegate.constructor;
    var origBroadcast = Scope.prototype.$broadcast;
    var origEmit = Scope.prototype.$emit;

    Scope.prototype.$broadcast = function() {
      console.log("$broadcast was called on $scope " + this.$id + " with arguments:",
                     arguments);
      return origBroadcast.apply(this, arguments);
    };
    Scope.prototype.$emit = function() {
      console.log("$emit was called on $scope " + this.$id + " with arguments:",
                     arguments);
      return origEmit.apply(this, arguments);
    };
    return $delegate;
    });
});

有关$ provide.decorate的更多信息:

[1] http://blog.xebia.com/extending-angularjs-services-with-the-decorate-method/

[2] https://docs.angularjs.org/api/auto/service/ $提供

答案 1 :(得分:8)

你不能真的这样做,那将是一种反模式。

相反,您应该创建一个处理事件发射和处理的服务,以便您可以从那里完成所有这些逻辑:

module.service('events', function($rootScope) {
  var onAllCallbacks = [];

  this.broadcast = function(name, data) {
    $rootScope.$broadcast(name, data);
    onAllCallbacks.forEach(function(cb) { cb(name, data); });
  }

  this.on = function(name, callback) {
    $rootScope.$on(name, callback);
  }

  this.onAll = function(callback) {
    onAllCallbacks.push(callback);
  }
})

然后在你的代码中

events.onAll(function(name, data) {
  console.log('Broadcasted event:', name, data);
});

events.broadcast('foo', data1);
events.broadcast('bar', data2);

通过这种方式,您只能使用events.broadcast来广播您希望从onAll侦听器中了解的事件。

答案 2 :(得分:-3)

$ rootScope。$ broadcast会自动“广播”该变量/对象的结果。当你需要另一端时,是监听器 - $ rootScope。$ on。它看起来像这样:

//broadcast
$rootScope.$broadcast('variableName');

//listener
$rootScope.$on('variableName', function(event, args){
    //do whatever you want in here when 'variableName' is broadcasted
});