La question principale - est-ce possible? J'ai essayé sans succès.
app.js principal
...
var app = angular.module('myApp', ['services']);
app.config(['customProvider', function (customProvider) {
}]);
...
fournisseur lui-même
var services = angular.module('services', []);
services.provider('custom', function ($http) {
});
Et j'ai une telle erreur:
Uncaught Error: Unknown provider: $http from services
Des idées?
Merci!
javascript
angularjs
angular-services
Kosmetika
la source
la source
app.config
partieRéponses:
L'essentiel est:
Détails:
Le framework angulaire a un processus d'initialisation en 2 phases:
PHASE 1: Config
Pendant la
config
phase, tous les fournisseurs sont initialisés et toutes lesconfig
sections sont exécutées. Lesconfig
sections peuvent contenir du code qui configure les objets fournisseur et par conséquent, elles peuvent être injectées avec des objets fournisseur. Cependant, comme les fournisseurs sont les usines des objets de service et à ce stade, les fournisseurs ne sont pas entièrement initialisés / configurés -> vous ne pouvez pas demander au fournisseur de créer un service pour vous à ce stade -> à l'étape de configuration, vous ne pouvez pas utiliser / injecter des services . Lorsque cette phase est terminée, tous les fournisseurs sont prêts (aucune autre configuration de fournisseur ne peut être effectuée une fois la phase de configuration terminée).PHASE 2: Courir
Pendant la
run
phase, toutes lesrun
sections sont exécutées. À ce stade, les fournisseurs sont prêts et peuvent créer des services -> pendant larun
phase, vous pouvez utiliser / injecter des services .Exemples:
1. Injecter le
$http
service de la fonction d'initialisation du fournisseur WILL NOT travailPuisque nous essayons d'injecter le
$http
service dans une fonction qui est exécutée pendant laconfig
phase, nous obtiendrons une erreur:Ce que cette erreur dit en fait, c'est que le
$httpProvider
qui est utilisé pour créer le$http
service n'est pas encore prêt (puisque nous sommes encore dans laconfig
phase).2. Injecter le
$http
service de la fonction d' initialisation du service WILL travail:Puisque nous injectons maintenant le service dans la fonction d'initialisation du service, qui est exécutée pendant la
run
phase, ce code fonctionnera.la source
<script>var config = <% = mySettings.toJson() %>;</script>
). Cela peut être fait en utilisant un moteur de création de modèles tel que Smarty pour PHP, Jinja2 pour Python, Nunchucks pour NodeJS, etc.Cela pourrait vous donner un petit effet de levier:
Mais attention, les rappels succès / erreur peuvent vous maintenir dans une situation de concurrence critique entre le démarrage de l'application et la réponse du serveur.
la source
angular.injector(['mymodule'])
- mais je ne suis pas sûr que vous puissiez utiliser cette approche pour le$http
service. Je veux dire que je l'ai fait. Je ne sais pas si cela aide ou non: - /C'est une vieille question, il semble que nous ayons quelque chose à faire avec des œufs de poule si nous voulons nous fier aux capacités de base de la bibliothèque.
Au lieu de résoudre le problème de manière fondamentale, ce que j'ai fait, c'est le contourner. Créez une directive qui englobe tout le corps. Ex.
Il
mc-body
doit maintenant être initialisé avant le rendu (une fois), ex.Auth
est un service ou un fournisseur, ex.Il me semble que j'ai le contrôle sur l'ordre du bootstrap, c'est après que le bootstrap normal ait résolu toute la configuration du fournisseur et ensuite essayé d'initialiser la
mc-body
directive.Et cette directive me semble pouvoir être en avance sur le routage, car le routage est également injecté via une directive ex.
<ui-route />
. Mais je peux me tromper là-dessus. Nécessite une enquête plus approfondie.la source
En réponse à votre question, "Des idées?", J'aurais répondu par "oui". Mais attendez, il y a plus!
Je suggère simplement d'utiliser JQuery dans la configuration. Par exemple:
la source