angularjs中的循环引用异常

时间:2013-12-24 10:42:24

标签: javascript angularjs interceptor

我在angularjs spa中有以下工厂定义:

(function () {
  'use strict';

  angular.module('snApp')
  .factory('Auth', ['$http', 'localStorageService', function ($http,     localStorageService) {

   //code goes here
  }]);
})();

然后在我的应用程序配置中,我有以下http拦截器设置:

var app = angular.module('snApp', ['ui.router', 'LocalStorageModule', ])
.config(['$logProvider', '$stateProvider', '$urlRouterProvider', '$httpProvider',     '$provide', function ($logProvider, $stateProvider, $urlRouterProvider, $httpProvider,     $provide) {

    // Intercept http calls.
  $provide.factory('RequestHttpInterceptor', function ($q, Auth) {
      return {
          // On request success
          request: function ($config) {
              if (Auth.user) {
                  $config.headers['XToken'] = Auth.user.token;
              }
              return $config;
          }
      };
  });
  // Add the interceptor to the $httpProvider.
  $httpProvider.interceptors.push('RequestHttpInterceptor');
}]);

当我运行应用程序时,出现以下错误:

Uncaught Error: [$injector:cdep]

我认为它与我的Auth中的$ http有关,因为如果我删除它然后它可以工作,但我需要它!

如果有人能帮助我理解我做错了什么,那就太棒了!

2 个答案:

答案 0 :(得分:5)

好的,我明白了。由于它是一个http拦截器,angular不喜欢你将$ http传递给你的工厂的事实 - 这是有道理的,因为如果你在http拦截器中调用$ http它将调用拦截器,它将调用$ http获得这种无限循环等等。

幸运的是,我只需要在工厂购买一个房产,所以我从Auth工厂抽出了这个房产,因此不需要$ http。还有其他方法可以做到,但这对我来说是最好的解决方案。

答案 1 :(得分:2)

您仍然可以注入$injector并在需要时创建$http。有关示例,请参阅here

另一种选择是发出/广播消息并在其他地方捕获它(例如,作为运行的一部分。)