Configura il tuo servizio come fornitore AngularJS personalizzato
Nonostante ciò che dice la risposta accettata, in realtà PUOI fare quello che avevi intenzione di fare, ma devi impostarlo come provider configurabile, in modo che sia disponibile come servizio durante la fase di configurazione. Innanzitutto, cambia il tuo Service
in un provider come mostrato di seguito. La differenza chiave qui è che dopo aver impostato il valore di defer
, si imposta la defer.promise
proprietà sull'oggetto promessa restituito da $http.get
:
Servizio provider: (fornitore: ricetta di servizio)
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;
})
}
}
Ora hai un Provider personalizzato configurabile, devi solo iniettarlo. La differenza chiave qui è il mancante "Provider sul tuo iniettabile".
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();
}
}
})
});
usa i dati risolti nel tuo 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);
}
})
Possibili alternative
La seguente alternativa è un approccio simile, ma consente la definizione all'interno del .config
, incapsulando il servizio all'interno del modulo specifico nel contesto della tua app. Scegli il metodo che fa per te. Vedi anche sotto per le note su una terza alternativa e link utili per aiutarti a capire come funzionano tutte queste cose
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:
}
})
});
Alcune risorse utili
- John Lindquist ha un'eccellente spiegazione e dimostrazione di 5 minuti su egghead.io ed è una delle lezioni gratuite! Ho sostanzialmente modificato la sua dimostrazione rendendola
$http
specifica nel contesto di questa richiesta
- Visualizza la guida per gli sviluppatori di AngularJS sui provider
- C'è anche un'eccellente spiegazione su
factory
/ service
/ provider
su clevertech.biz .
Il provider ti offre un po 'più di configurazione sul .service
metodo, il che lo rende migliore come provider a livello di applicazione, ma potresti anche incapsularlo all'interno dell'oggetto stesso $provide
config iniettando in config in questo modo: