Configure su servicio como un proveedor personalizado de AngularJS
A pesar de lo que dice la respuesta aceptada, en realidad PUEDES hacer lo que pretendías hacer, pero debes configurarlo como un proveedor configurable, para que esté disponible como un servicio durante la fase de configuración. Primero, cambia tu Servicea un proveedor Como se muestra abajo. La diferencia clave aquí es que después de establecer el valor de defer, establece la defer.promisepropiedad en el objeto de promesa devuelto por $http.get:
Servicio de proveedor: (proveedor: receta de servicio)
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;
})
}
}
Ahora, tiene un proveedor personalizado configurable, solo necesita inyectarlo. La diferencia clave aquí es la falta de "Proveedor en su inyectable".
config:
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();
}
}
})
});
utilizar datos resueltos en su 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);
}
})
Posibles alternativas
La siguiente alternativa es un enfoque similar, pero permite que la definición ocurra dentro del .configencapsulado del servicio dentro del módulo específico en el contexto de su aplicación. Elija el método adecuado para usted. También vea a continuación las notas sobre una tercera alternativa y enlaces útiles para ayudarlo a entender todas estas cosas
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:
}
})
});
Algunos recursos útiles
- John Lindquist tiene una excelente explicación y demostración de 5 minutos de esto en egghead.io , ¡y es una de las lecciones gratuitas! Básicamente modifiqué su demostración haciéndola
$httpespecífica en el contexto de esta solicitud
- Ver la guía para desarrolladores de AngularJS sobre proveedores
- También hay una excelente explicación sobre
factory/ service/ provider en clevertech.biz .
El proveedor le brinda un poco más de configuración sobre el .servicemétodo, lo que lo hace mejor como proveedor de nivel de aplicación, pero también puede encapsular esto dentro del propio objeto de configuración al inyectar $provideen la configuración de la siguiente manera: