Je souhaite injecter un service dans app.config, afin que les données puissent être récupérées avant l'appel du contrôleur. Je l'ai essayé comme ceci:
Un service:
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;
}
};
});
Config:
app.config(function ($routeProvider, dbService) {
$routeProvider
.when('/',
{
templateUrl: "partials/editor.html",
controller: "AppCtrl",
resolve: {
data: dbService.getData(),
}
})
});
Mais j'obtiens cette erreur:
Erreur: fournisseur inconnu: dbService de EditorApp
Comment corriger la configuration et injecter ce service?
Réponses:
Alex a fourni la bonne raison pour ne pas pouvoir faire ce que vous essayez de faire, donc +1. Mais vous rencontrez ce problème car vous n'utilisez pas tout à fait les résolutions de leur conception.
resolve
prend soit la chaîne d'un service, soit une fonction renvoyant une valeur à injecter. Puisque vous faites ce dernier, vous devez passer une fonction réelle:Lorsque le framework va se résoudre
data
, il injectera ledbService
dans la fonction afin que vous puissiez l'utiliser librement. Vous n'avez pas du tout besoin d'injecter dans leconfig
bloc pour y parvenir.Bon appétit!
la source
.service
, alors déplacez-vous$q
et$http
là.pageData: 'myData'
, mais vous devrez alors appelerpageData.overview
depuis votre contrôleur. La méthode string n'est probablement utile que si la fabrique de services a renvoyé une promesse au lieu d'une API. Donc, la façon dont vous le faites actuellement est probablement la meilleure.Configurez votre service en tant que fournisseur AngularJS personnalisé
Malgré ce que dit la réponse Acceptée, vous POUVEZ faire ce que vous aviez l'intention de faire, mais vous devez le configurer en tant que fournisseur configurable, afin qu'il soit disponible en tant que service pendant la phase de configuration. Commencez par changer votre
Service
fournisseur. comme indiqué ci-dessous. La principale différence ici est qu'après avoir défini la valeur dedefer
, vous définissez ladefer.promise
propriété sur l'objet de promesse renvoyé par$http.get
:Service fournisseur: (fournisseur: recette de service)
Maintenant, vous avez un fournisseur personnalisé configurable, il vous suffit de l'injecter. La principale différence ici étant le "fournisseur sur votre injectable" manquant.
config:
utiliser des données résolues dans votre
appCtrl
Alternatives possibles
L'alternative suivante est une approche similaire, mais permet à la définition de se produire dans le
.config
, encapsulant le service dans le module spécifique dans le contexte de votre application. Choisissez la méthode qui vous convient. Voir également ci-dessous pour des notes sur une troisième alternative et des liens utiles pour vous aider à comprendre toutes ces choses.Quelques ressources utiles
$http
spécifique dans le cadre de cette demandefactory
/service
/provider
sur clevertech.biz .Le fournisseur vous donne un peu plus de configuration sur la
.service
méthode, ce qui la rend meilleure en tant que fournisseur de niveau application, mais vous pouvez également l'encapsuler dans l'objet de configuration lui-même en l'injectant$provide
dans la configuration comme ceci:la source
$get
appel. Au lieu de cela, vous souhaitez ajouter des méthodes sur l'instance du fournisseur et revenir simplementthis
lorsque vous appelez$get
. En fait, dans votre exemple, vous pourriez simplement utiliser un service ... Dans un fournisseur, vous ne pouvez pas non plus injecter de services comme$http
. Et au fait, ce//return the factory as a provider, that is available during the configuration phase
sont des informations trompeuses / incorrectesRéponse courte: vous ne pouvez pas. AngularJS ne vous permettra pas d'injecter des services dans la configuration car il ne peut pas être sûr qu'ils ont été chargés correctement.
Voir cette question et réponse: Injection de dépendance AngularJS de valeur à l'intérieur de module.config
source
Je ne pense pas que vous soyez censé pouvoir le faire, mais j'ai réussi à injecter un service dans un
config
bloc. (AngularJS v1.0.7)source
.config
vous avez écrit cacheBuster (qui n'est défini nulle part dans la réponse) et dogmaCacheBusterProvider (qui n'est plus utilisé). Allez-vous clarifier cela?cacheBuster
est défini, en tant que paramètre de la fonction de configuration. En ce qui concernedogmaCacheBusterProvider
, c'est quelque chose d'intelligent qu'Angular fait avec les conventions de nommage, que j'ai oublié depuis longtemps. Cela pourrait vous rapprocher, stackoverflow.com/a/20881705/110010 ..provider()
recette. que se passe-t-il si je définis quelque chose avec.factory('ServiceName')
ou une.service('ServiceName')
recette et que je veux utiliser l'une de ses méthodes en.config
bloc, définissez le paramètre sur ServiceNameProvider mais cela arrête mon application.Vous pouvez utiliser $ inject service pour injecter un service dans votre configuration
Source: http://odetocode.com/blogs/scott/archive/2014/04/21/better-error-handling-in-angularjs.aspx
** Demander explicitement des services à d'autres modules en utilisant angular.injector **
Juste pour élaborer sur la réponse de kim3er , vous pouvez fournir des services, des usines, etc. sans les changer en fournisseurs, à condition qu'ils soient inclus dans d'autres modules ...
Cependant, je ne suis pas sûr si le
*Provider
(qui est créé en interne par angular après avoir traité un service ou une usine) sera toujours disponible (cela peut dépendre de ce qui est chargé en premier), car angular charge paresseusement les modules.Notez que si vous souhaitez réinjecter les valeurs, elles doivent être traitées comme des constantes.
Voici un moyen plus explicite et probablement plus fiable de le faire + un plunker fonctionnel
la source
Utilisation de $ injector pour appeler des méthodes de service dans config
J'ai eu un problème similaire et je l'ai résolu en utilisant le service $ injector comme indiqué ci-dessus. J'ai essayé d'injecter le service directement mais je me suis retrouvé avec une dépendance circulaire sur $ http. Le service affiche un modal avec l'erreur et j'utilise le modal ui-bootstrap qui a également une dépendance sur $ https.
la source
Une solution très facile à faire
Remarque : c'est uniquement pour un appel asynchrone, car le service n'est pas initialisé lors de l'exécution de la configuration.
Vous pouvez utiliser la
run()
méthode. Exemple :Votre code :
la source
Eh bien, j'ai eu un peu de mal avec celui-ci, mais je l'ai fait.
Je ne sais pas si les réponses sont obsolètes en raison d'un changement d'angle, mais vous pouvez le faire de cette façon:
Ceci est votre service:
Et c'est la config
la source
Moyen le plus simple:
$injector = angular.element(document.body).injector()
Ensuite, utilisez-le pour exécuter
invoke()
ouget()
la source