2013-08-28 22 views
5

使用AngularJS 1.2如何从http拦截器进行广播?

我的截击看起来是这样的:

 $httpProvider.interceptors.push(['$q', '$log', '$rootScope', function ($q, $log, $rootScope) { 
      return { 
       'request': function(config) { 
        $rootScope.$broadcast('spin'); 
        console.info('request!'); 
        return config || $q.when(config); 
       }, 
... 

在我的导航控制器(用来处理和装载/微调结合的观点):

$rootScope.$watch('spin', function(event) { 
    console.info('spin'); 
    $scope.spinner++; 
}); 

广播似乎尽管我可以看到很多请求,但在收到的所有回复结束时只发生一次!在控制台日志中输入

我该如何管理我的全局微调器/加载器?

编辑 我希望在加载数据时在导航栏中显示加载器/微调器。

+0

你想使用这个 –

+0

@Ajaybeniwal编辑要达到什么:目的添加 – Tjorriemorrie

回答

4

$watch功能不监听广播消息。它注意范围的变化。在这种情况下,只要$rootScope.spin发生更改,即调用(默认情况下)立即调用某个函数,这就是您调用一次的原因。

$on函数就是你想要的,因为它是监听广播事件的东西。

$rootScope.$on('spin', function(msg, data) { 
    console.info('spin'); 
    $scope.spinner++; 
}); 

我已经把如果你是好奇一个完整的工作示例:

http://codepen.io/BrianGenisio/pen/wIBHz

3

而不是使用观察家你应该只在模块运行功能使用上

angular.module('test',[]).run(['$rootScope' function ($rootScope) { 
    $rootScope.$on("$spin", function() { 
     // set the spinner here 
    }); 

}]); 
+0

我在哪里可以找到更多有关'run'和'$ on'和'$ broadcast'的信息? – Tjorriemorrie

+0

http://code.angularjs.org/1.2.0rc1/docs/api/angular.Module http://code.angularjs.org/1.2.0rc1/docs/api/ng.$ro​​otScope.Scope –