Configurer votre service personnalisé AngularJS Fournisseur
En dépit de ce que l'on a Accepté la réponse dit, vous POUVEZ faire ce que vous avaient l'intention de le faire, mais vous devez le configurer en tant que configurable fournisseur, de sorte qu'il est disponible comme un service au cours de la phase de configuration.. d'Abord, changer votre Service
auprès d'un fournisseur comme indiqué ci-dessous. La principale différence ici est qu'après le réglage de la valeur de defer
, vous définissez l' defer.promise
de la propriété de la promesse de l'objet renvoyé par $http.get
:
Fournisseur de Service: (fournisseur de: service de la recette)
app.provider('dbService', function dbServiceProvider() {
//the provider recipe for services require you specify a $get function
this.$get= ['dbhost',function dbServiceFactory(dbhost){
return new DbService(dbhost); //return the factory as a provider, that is available during the configuration phase
}]
});
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(){
return status; // now we return an object with data or information about error for special handling inside your application configuration
})
}
}
Maintenant, vous avez un configurable Fournisseur personnalisé, il vous suffit de l'injecter. Principale différence ici étant le manque de "Fournisseur sur votre injectable".
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();
}
}
})
});
utilisation résolu de données dans votre 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);
}
})
Alternatives Possibles
L'alternative suivante est une approche similaire, mais permet de définir à l'intérieur de l' .config
, en encapsulant le service à l'intérieur du module spécifique dans le contexte de votre application. Choisissez la méthode qui vous convient. Voir aussi ci-dessous des notes sur une 3ème alternative et liens utiles pour vous aider à obtenir le blocage de toutes ces choses
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:
}
}
})
});
Quelques Ressources utiles
- Jean-Lindquist a un super 5 minutes d'explication et de démonstration de ce à tête d'oeuf.io, et c'est l'une des leçons gratuites! En gros, j'ai modifié sa démonstration en la rendant
$http
spécifiques dans le contexte de la présente demande
- Consulter le guide du Développeur AngularJS sur les Fournisseurs de
- Il est également une excellente explication à propos de
factory
/service
/provider
à clevertech.biz.
Le fournisseur vous donne un peu plus de configuration sur l' .service
méthode, ce qui la rend plus comme une application fournisseur de niveau, mais vous pouvez également saisir cette dans la config de l'objet lui-même par l'injection d' $provide
en config comme ceci: