我会尽量保持简短。基本上我有这个模块......
var mod1= angular.module("mod1", ['ngRoute', 'ngCookies']);
然后是服务,拦截器,工厂和控制器......
mod1.service("sessionService", sessionService);
mod1.factory("loginFactory", loginFactory);
mod1.controller("accountController", accountController);
sessionService
位于一个单独的文件中,它基本上将一些函数公开给本地存储中的会话信息......
var sessionService = function ($httpProvider) {
return {
startSession: function (token) {
localStorage.setItem('so_acc_token', token.access_token);
localStorage.setItem('so_acc_token_type', token.token_type);
$httpProvider.defaults.headers.common.Authorization = token.token_type + " " + token.access_token;
},
//a couple more functions, removed for clarity
...
}
}
sessionService.$inject = ["$httpProvider"];
现在,loginFactory
(假设更多的模块和工厂)调用/取决于这个“单例”服务。它也位于一个单独的文件中,看起来像这样......
var loginFactory = function ($http, $q, sessionService) {
return function (u, p, g, c) {
var deferredObject = $q.defer();
var data = { grant_type: g, username: u, password: p };
var transformRequest = function (d) {
var t = [];
for (var k in d) {
t.push(encodeURIComponent(k) + "=" + encodeURIComponent(d[k]));
}
return t.join("&");
};
$http.post('http://whatever_url/token',
transformRequest(data), {
headers: { "Content-Type": "application/x-www-form-urlencoded" }
})
.success(function (data) {
//sessionService.startSession(data);
deferredObject.resolve({ success: true });
})
.error(function () {
//sessionService.endSession();
deferredObject.resolve({ success: false });
});
return deferredObject.promise;
}
}
loginFactory.$inject = ["$http", "$q", "sessionService"];
最后在遇到特定路线时调用帐户控制器......控制器看起来像这样......
var accountController = function ($scope, $routeParams, $location, loginFactory) {
$scope.loginForm = {
userName: '',
password: '',
grant_type: 'password',
loginFailure: false
};
$scope.signIn = function () {
var result = loginFactory($scope.loginForm.userName,
$scope.loginForm.password,
$scope.loginForm.grant_type);
result.then(function (result) {
if (result.success) {
if ($scope.loginForm.returnUrl !== undefined) {
$location.path($scope.loginForm.returnUrl);
}
else {
$location.path('/');
}
}
else {
$scope.loginForm.loginFailure = true;
}
});
};
};
accountController.$inject = ['$scope', '$routeParams', "$location", "loginFactory"];
但是,当从signIn
调用accountController
方法时,我收到以下错误...
Error: [$injector:unpr] http://errors.angularjs.org/1.3.0/$injector/unpr?p0=%24httpProviderProvider%20%3C-%20%24httpProvider%20%3C-<div ng-view="" class="ng-scope">essionService%20%3C-%20loginFactory
我认为这与我向服务注入$httpProvider
的方式有关,但我很难理解为什么。所以,我的问题是......
P.S。对于问题的篇幅我很抱歉,但我想为它添加一些上下文
答案 0 :(得分:3)
提供商只能在配置阶段使用。完成该阶段后,将从提供程序创建服务,并且不再使用提供程序。 因此,无法在服务中注入提供程序。
要解决您的特定问题,只需注入$ http服务:可以直接在服务上配置标头。 MSDN:
默认值也可以在运行时通过$ http.defaults对象以相同的方式设置。例如:
module.run(function($http) { $http.defaults.headers.common.Authorization = 'Basic YmVlcDpib29w' });