【问题标题】:How to intercept all $rootScope.$broadcast events in angular.js如何拦截 angular.js 中的所有 $rootScope.$broadcast 事件
【发布时间】:2015-04-01 19:49:49
【问题描述】:

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

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

【问题讨论】:

    标签: angularjs events


    【解决方案1】:

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

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

    我将从链接中复制代码以供后代使用,稍作调整(以使用当前版本的 angular):

    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/$provide

    【讨论】:

    • 不错的方法,我一直在寻找类似 .provider 的东西,但这可以解决问题,我认为应该是公认的答案。
    【解决方案2】:

    你不能真正做到这一点,那将是一种反模式。

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

    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 侦听器了解的事件。

    【讨论】:

      【解决方案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
      });
      

      【讨论】:

      • 您好,感谢您的帮助,但我需要知道的是如何拦截所有广播事件。
      • 您可以对变量集合设置监视$rootScope.$watchGroup(['var1','var2', 'var3'], function(event,args){ do stuff });
      • watchGroup 不会拦截广播事件,而是拦截范围内的表达式,所以这是不相关的
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-16
      • 2011-12-28
      • 2011-04-10
      • 2011-01-05
      • 2014-11-05
      相关资源
      最近更新 更多