0

我正在将 angularAMD 与 require js 一起使用,并且我编写了一个拦截器服务,我想在我的应用程序配置文件中使用 $httpProvider.interceptors 进行注册,但它抛出错误为

错误:[$injector:unpr ] http://errors.angularjs.org/1.4.8/$injector/unpr?p0=cookieInjectorProvider%…eInjector%20%3C-%20%24http%20%3C-%20% 24templateRequest%20%3C-%20%24compile(…)

以下是我的暗示

define(["angularAMD", "angular-route", "ui-bootstrap","ngCookies","common/service/interceptor-service"], function(angularAMD){
"use strict";

var app = angular.module("app", ["ui.router", "ui.bootstrap","ngAnimate","ngTouch","angular-carousel","ngCookies"]);

  //route
  app.config(["$stateProvider", "$urlRouterProvider", "$locationProvider","$httpProvider", function($stateProvider, $urlRouterProvider, $locationProvider,$httpProvider){
    $urlRouterProvider.otherwise('/');

    $stateProvider
    .state("home", angularAMD.route({

     url: "/",
     views:  {  

       'header':{
          /*...*/
        },

      },
      'content': {
        /*...*/
      },

      'footer': {
        /*...*/

      }
  }));
  **//angular is not able to find 'cookieInjector' service**
  $httpProvider.interceptors.push('cookieInjector');
  }]);


  // Bootstrap Angular when DOM is ready
  return angularAMD.bootstrap(app, false, document.getElementsByTagName("body")[0]);
});

而我的“cookieInjector 文件是”这个服务需要另一个服务,它也以类似的方式实现

    define([
  'angularAMD',
  "common/service/cookie-service"
  ], function(angularAMD){
    angularAMD.service("cookieValidator",[function(){
      this.isLoggedIn = false;
      this.getIsLoggedIn = function(){
          return this.isLoggedIn;
      };
      this.setIsLoggedIn = function(status){
          this.isLoggedIn = status;
      };  
    }])
    .factory('cookieInjector', ['$q','cookieValidator', 'cookieService',function($q,cookieValidator,cookieService) {
      var cookieInjector = {
        request: function(config) {
          var cookie = cookieService.getCookie();
          if(!cookie){
            cookieValidator.setIsLoggedIn(false);
            //$location.path('/login');
          }else{
            cookieValidator.setIsLoggedIn(true);
          }
            config.headers['Token'] = cookie ? cookie : null;
            return config;
        },
        response: function(response) {
            response.config.responseTimestamp = new Date().getTime();
            return response;
        },
        responseError: function(response) {
            // Cookie has expired
            if(response.status === 401 || response.status === 403) {
              cookieService.destroyCookie();
              cookieValidator.setIsLoggedIn(false);
            }
            return $q.reject(response);
        }
    };
    return cookieInjector;
  }]);
})

我完全被卡住了。谢谢你的帮助。

4

1 回答 1

1

角度无法找到“cookieInjector”服务

这可能是因为cookieInjector在 app.config 运行时不可用。据我angularAMD.factory()所知,只会在app.config()运行后将您的工厂/服务注入您的应用程序。

所以在这种情况下,应该使用另一个全局角度模块而不是使用angularAMD

创建一个文件cookieInjector.js

angular.module('cookieModule', []).facotry('cookieInjector', ['$q', 'cookieValidator', 'cookieService', function($q, cookieValidator, cookieService) {
    var cookieInjector = {
        request: function(config) {
            var cookie = cookieService.getCookie();
            if (!cookie) {
                cookieValidator.setIsLoggedIn(false);
                //$location.path('/login');
            } else {
                cookieValidator.setIsLoggedIn(true);
            }
            config.headers['Token'] = cookie ? cookie : null;
            return config;
        },
        response: function(response) {
            response.config.responseTimestamp = new Date().getTime();
            return response;
        },
        responseError: function(response) {
            // Cookie has expired
            if (response.status === 401 || response.status === 403) {
                cookieService.destroyCookie();
                cookieValidator.setIsLoggedIn(false);
            }
            return $q.reject(response);
        }
    };
    return cookieInjector;
}]);

然后 init 可以配置您的应用程序。

// requireJS config
requirejs.config({
    path:{
        cookieInjector: 'path/to/cookieInjector'
    }
    // ... your codes

    shim: {
        // ... your codes
        // make sure cookie injector only load after angularJS is loaded.
        cookieInjector: ["angular"];
    }
});

// your app.js (?) file
define(["angularAMD", "cookieInjector", "angular-route", "ui-bootstrap", "ngCookies", "common/service/interceptor-service"], function(angularAMD) {
    "use strict";

    var app = angular.module("app", ["cookieModule", "ui.router", "ui.bootstrap", "ngAnimate", "ngTouch", "angular-carousel", "ngCookies"]);

    //route
    app.config(["$stateProvider", "$urlRouterProvider", "$locationProvider", "$httpProvider", function($stateProvider, $urlRouterProvider, $locationProvider, $httpProvider) {
        $urlRouterProvider.otherwise('/');

        $stateProvider
        .state("home", angularAMD.route({

            url: "/",
            views: {

                'header': {
                    /*...*/
                },

            },
            'content': {
                /*...*/
            },

            'footer': {
                /*...*/

            }
        })); 
        // It should be loaded now
        $httpProvider.interceptors.push('cookieInjector');
    }]);


    // Bootstrap Angular when DOM is ready
    return angularAMD.bootstrap(app, false, document.getElementsByTagName("body")[0]);
});
于 2016-02-19T07:23:17.100 回答