如何从http拦截器广播?

时间:2013-08-28 09:10:14

标签: angularjs q

使用AngularJS 1.2

我的拦截器看起来像这样:

        $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++;
});

广播似乎只在收到的所有回复结束时发生一次,即使我在控制台日志中可以看到很多 request!

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

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

2 个答案:

答案 0 :(得分:4)

$watch函数不侦听广播消息。它会监视范围的变化。在这种情况下,只要$rootScope.spin发生变化就会调用一个函数,这会立即被调用(默认情况下),这就是你被调用一次的原因。

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

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

如果你很好奇,我已经把一个完整的工作示例放在一起:

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

答案 1 :(得分:3)

您应该只使用模块运行功能

,而不是使用观察程序
angular.module('test',[]).run(['$rootScope' function ($rootScope) {
    $rootScope.$on("$spin", function () {
        // set the spinner here 
    });

}]);