Ne pouvez pas récupérer l'injecteur angulaires
J'ai cette application avec deux modules:
angular.module('components', []).directive('foo', function () { return {};});
angular.module('gaad', ['components']);
Il y a un tas de directives associées à ce module que je ne suis pas y compris ici.
L'application fonctionne très bien. Cependant lorsque j'essaie de récupérer de l'injecteur pour le module gaad
:
var injector = angular.injector(['gaad', 'components']); //called after 'gaad' module initialization
l'erreur est levée:
Uncaught Error: Unknown provider: $compileProvider from components
L'application est assez grande maintenant et je n'ai aucune idée de l'endroit où dois-je regarder pour les bugs.
Donc ma question est: Ce qui pourrait être la raison de mes problèmes?
EDIT:
J'ai été en mesure de reproduire mon problème: http://jsfiddle.net/selbh/ehmnt/11/
- BTW,si vous utilisez ng-app, vous n'avez pas besoin de créer l'application de l'injecteur.
Vous devez vous connecter pour publier un commentaire.
Avant de répondre à la question que nous devons noter qu'il n'y est un seul injecteur exemple par l'application et non par module. En ce sens, il n'est pas possible de récupérer un injecteur par module. Bien sûr, si nous prenons le premier niveau d'un module, il représente l'ensemble de l'application. En ce sens, une application de haut niveau module semblent équivalentes. Il peut sembler comme une différence subtile, mais il est important de la comprendre entièrement et correctement répondre à cette question.
Prochain, à partir de ce que je peux comprendre que vous aimeriez récupérer la
$injector
et de ne pas créer une nouvelle instance. Le truc, c'est que leangular.injector
va créer un nouveau$injector
exemple pour les modules (une application) spécifié comme arguments. Ici, la principale AngularJS module (ng) doit être spécifié explicitement. Donc, dans cet exemple de code:que vous essayez de créer un nouveau injecteur de composants définis dans 'gaad' et 'composants' modules et évidemment
$compileProvider
n'est pas défini dans vos modules personnalisés. L'ajout de lang
module à la liste serait "résoudre" le problème en créant un nouvel injecteur - quelque chose que vous probablement ne voulez pas faire.De récupérer un injecteur instance associée à une application en cours d'exécution on peut utiliser 2 méthodes:
$injector
exemple: http://docs.angularjs.org/api/angular.injectorangular.element([DOM element]).injector()
où [l'élément DOM] est un dôme où l'ng-app
a été défini (ou tout élément enfant de l'élément). Plus d'infos ici: http://docs.angularjs.org/api/angular.elementVoici le jsFiddle montrant 2 méthodes de l'injecteur de l'extraction: http://jsfiddle.net/xaQzb/
Veuillez également noter que l'utilisation de
$injector
directement n'est pas très commun scénario de l'extérieur de l'unité de test. Il pourrait être utile de pensée pour récupérer AngularJS services venant de l'extérieur de AngularJS monde. Plus d'infos ici: Appel Angular JS de code legacy.undefined
que l'injecteur. jsfiddle.net/xaQzb ... si vousconsole.log(injector)
il retourneundefined
. C'était censé être un pseudo-code?angular
objet. Avec l'aide de querySelector ?Il semble que vous devez inclure ng dans l'injecteur.
À partir de: AngularJS: injecteur
Le problème est dans le flux d'exécution Angulaire du code. À intégrer sur @pkozlowski.opensource de réponse et les commentaires, notez que le
$injector
propriété est mis à la disposition des éléments du DOM après le code du module est exécuté, de sorte que lorsque vous accédez à la propriété (comme lorsque vous essayez deconsole.log
), la propriété sera encoreundefined
.Vous pouvez résoudre ce problème en définissant simplement un 0 délai d'attente pour l'exécution de la fonction de journalisation (c'est à dire, pas explicites délai en millisecondes est nécessaire). Ce hack fonctionne parce que la fonction de journalisation sera exécutée lorsque la pile est vide, c'est quand Angulaire de l'amorçage est terminé et que l'
$injector
propriété est disponible pour les éléments du DOM.Un autre (peut-être meilleure) solution Angulaire jargon serait d'inclure votre
$injector
-l'accès à code dans un exécuter le bloc (voir aussi la API relatives à la). Le$injector
peut ensuite être facilement injecté dans la fonction d'initialisation comme un service normal. Cela fonctionne parce qu'exécuter des blocs sont mis en file d'attente et exécutée de manière asynchrone lorsque tous les amorçage est terminé.Vous trouverez ci-dessous deux violons, un pour chaque solution.
0 Timeout jsFiddle
Exécuter le bloc jsFiddle
MODIFIER
Aussi, il n'est habituellement pas besoin de charger explicitement la
ng
module. Dans les cas normaux, leng
modèle est déjà chargé automatiquement, sauf si vous souhaitez effectuer un manuel de bootstrap Angulaire du code. Le morceau de docs référencé dans l'une des réponses se réfère (implicitement, malheureusement) Angulaire manuel de l'amorçage de la procédure, lorsque vous devez créer manuellement les injecteur et lui indiquer les modules que vous souhaitez charger