AngularJs Error: [$injector:unpr] while attempting to inject $httpProvider to a service
AngularJs Error: [$injector:unpr] while attempting to inject $httpProvider to a service
我会尽量保持简短。基本上我有这个模块...
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
(据称在更多模块和工厂上)calls/depends 在此“单例”服务上。它也位于一个单独的文件中,看起来像这样...
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"];
但是,当从 accountController
调用 signIn
方法时,我得到以下错误...
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。对于问题的长度,我很抱歉,但我想为其添加一些上下文
提供程序只能在配置阶段使用。一旦该阶段完成,服务就从提供者创建,并且提供者不能再被使用。
所以在服务中注入提供者是不可能的。
要解决您的特定问题,只需注入 $http 服务即可:headers 可以直接在该服务上进行配置。 Documentation:
The defaults can also be set at runtime via the $http.defaults object in the same fashion. For example:
module.run(function($http) {
$http.defaults.headers.common.Authorization = 'Basic YmVlcDpib29w'
});
我会尽量保持简短。基本上我有这个模块...
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
(据称在更多模块和工厂上)calls/depends 在此“单例”服务上。它也位于一个单独的文件中,看起来像这样...
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"];
但是,当从 accountController
调用 signIn
方法时,我得到以下错误...
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。对于问题的长度,我很抱歉,但我想为其添加一些上下文
提供程序只能在配置阶段使用。一旦该阶段完成,服务就从提供者创建,并且提供者不能再被使用。 所以在服务中注入提供者是不可能的。
要解决您的特定问题,只需注入 $http 服务即可:headers 可以直接在该服务上进行配置。 Documentation:
The defaults can also be set at runtime via the $http.defaults object in the same fashion. For example:
module.run(function($http) { $http.defaults.headers.common.Authorization = 'Basic YmVlcDpib29w' });