将您的服务设置为自定义 AngularJS 提供程序
尽管接受的答案说了什么,您实际上可以做您打算做的事情,但是您需要将其设置为可配置的提供程序,以便在配置阶段它可以作为服务使用。首先,将您更改Service
为提供程序如下所示。这里的关键区别在于,在设置 的值之后defer
,您将defer.promise
属性设置为由返回的承诺对象$http.get
:
提供者服务:(提供者:服务配方)
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;
})
}
}
现在,你有了一个可配置的自定义 Provider,你只需要注入它。这里的主要区别是缺少“注射剂上的提供者”。
配置:
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:
}
})
});
一些有用的资源
提供程序为您提供了比该.service
方法更多的配置,这使其作为应用程序级提供程序更好,但您也可以通过注入$provide
配置将其封装在配置对象本身中,如下所示: