我想向app.config注入一个服务,这样就可以在调用控制器之前检索数据。我是这样尝试的:
服务:
app.service('dbService', function() {
return {
getData: function($q, $http) {
var defer = $q.defer();
$http.get('db.php/score/getData').success(function(data) {
defer.resolve(data);
});
return defer.promise;
}
};
});
配置:
app.config(function ($routeProvider, dbService) {
$routeProvider
.when('/',
{
templateUrl: "partials/editor.html",
controller: "AppCtrl",
resolve: {
data: dbService.getData(),
}
})
});
但是我得到了这个错误:
错误:未知提供程序:来自EditorApp的dbService
如何正确设置和注入此服务?
发布于 2013-04-11 07:12:11
Alex提供了不能做你想做的事情的正确原因,所以+1。但是你遇到了这个问题,因为你没有很好地使用它们是如何设计的。
resolve
接受服务的字符串或返回要注入的值的函数。由于执行的是后者,因此需要传入一个实际的函数:
resolve: {
data: function (dbService) {
return dbService.getData();
}
}
当框架解析data
时,它会将dbService
注入到函数中,以便您可以自由使用它。您根本不需要注入到config
块中就可以做到这一点。
祝你开胃愉快!
发布于 2014-02-09 02:50:49
将您的服务设置为自定义AngularJS提供程序
不管公认的答案是什么,您实际上可以做您想做的事情,但您需要将其设置为可配置的提供者,以便它在配置阶段作为服务可用。首先,将您的Service
更改为提供者,如下所示。这里的关键区别在于,在设置defer
的值之后,将defer.promise
属性设置为由$http.get
返回的promise对象
提供者服务:(提供者:服务配方)
app.provider('dbService', function dbServiceProvider() {
//the provider recipe for services require you specify a $get function
this.$get= ['dbhost',function dbServiceFactory(dbhost){
// return the factory as a provider
// that is available during the configuration phase
return new DbService(dbhost);
}]
});
function DbService(dbhost){
var status;
this.setUrl = function(url){
dbhost = url;
}
this.getData = function($http) {
return $http.get(dbhost+'db.php/score/getData')
.success(function(data){
// handle any special stuff here, I would suggest the following:
status = 'ok';
status.data = data;
})
.error(function(message){
status = 'error';
status.message = message;
})
.then(function(){
// now we return an object with data or information about error
// for special handling inside your application configuration
return status;
})
}
}
现在,您有了一个可配置的自定义提供程序,您只需注入它。这里的关键区别在于缺少“可注入的提供者”。
配置:
app.config(function ($routeProvider) {
$routeProvider
.when('/', {
templateUrl: "partials/editor.html",
controller: "AppCtrl",
resolve: {
dbData: function(DbService, $http) {
/*
*dbServiceProvider returns a dbService instance to your app whenever
* needed, and this instance is setup internally with a promise,
* so you don't need to worry about $q and all that
*/
return DbService('http://dbhost.com').getData();
}
}
})
});
在appCtrl
中使用已解析的数据
app.controller('appCtrl',function(dbData, DbService){
$scope.dbData = dbData;
// You can also create and use another instance of the dbService here...
// to do whatever you programmed it to do, by adding functions inside the
// constructor DbService(), the following assumes you added
// a rmUser(userObj) function in the factory
$scope.removeDbUser = function(user){
DbService.rmUser(user);
}
})
可能的替代方案
下面的替代方法是类似的方法,但允许在.config
中进行定义,将服务封装到应用程序上下文中的特定模块中。选择适合你的方法。也可以查看下面关于第三个备选方案的注释和有用的链接,帮助您掌握所有这些事情的诀窍
app.config(function($routeProvider, $provide) {
$provide.service('dbService',function(){})
//set up your service inside the module's config.
$routeProvider
.when('/', {
templateUrl: "partials/editor.html",
controller: "AppCtrl",
resolve: {
data:
}
})
});
一些有用的资源
$http
提供程序为您提供了比.service
方法更多的配置,这使得它更适合作为应用程序级别的提供程序,但您也可以通过将$provide
注入到配置中来将其封装在配置对象本身中,如下所示:
发布于 2013-04-11 06:40:52
简而言之:不能。AngularJS不允许您将服务注入到配置中,因为它不能确保它们已正确加载。
查看这个问题和答案:AngularJS dependency injection of value inside of module.config
模块是在引导过程中应用于应用程序的配置和运行块的集合。在其最简单的形式中,模块由两种类型的块的集合组成:
配置阻止在提供者注册和配置阶段执行- get。只有提供程序和常量才能注入到配置块中。这是为了防止服务在完全配置之前意外实例化。
https://stackoverflow.com/questions/15937267
复制相似问题