Existe-t-il un moyen d'injecter une dépendance tardive à un module angulaire déjà amorcé? Voici ce que je veux dire:
Dites que j'ai une application angulaire à l'échelle du site, définie comme:
// in app.js
var App = angular.module("App", []);
Et dans chaque page:
<html ng-app="App">
Plus tard, je rouvre l'application pour ajouter une logique basée sur les besoins de la page actuelle:
// in reports.js
var App = angular.module("App")
App.controller("ReportsController", ['$scope', function($scope) {
// .. reports controller code
}])
Maintenant, dire que l' un de ces bits sur la demande de la logique exige également leurs propres dépendances (comme ngTouch
, ngAnimate
, ngResource
, etc.). Comment puis-je les attacher à l'application de base? Cela ne semble pas fonctionner:
// in reports.js
var App = angular.module("App", ['ui.event', 'ngResource']); // <-- raise error when App was already bootstrapped
Je me rends compte que je peux tout faire à l'avance, c'est-à-dire -
// in app.js
var App = angular.module("App", ['ui.event', 'ngResource', 'ngAnimate', ...]);
Ou définissez chaque module seul, puis injectez tout dans l'application principale ( voir ici pour plus ):
// in reports.js
angular.module("Reports", ['ui.event', 'ngResource'])
.controller("ReportsController", ['$scope', function($scope) {
// .. reports controller code
}])
// in home.js
angular.module("Home", ['ngAnimate'])
.controller("HomeController", ['$scope', '$http', function($scope, $http){
// ...
}])
// in app.js, loaded last into the page (different for every page that varies in dependencies)
var App = angular.module("App", ['Reports', 'Home'])
Mais cela nécessitera d'initialiser l'application à chaque fois avec les dépendances de la page actuelle.
Je préfère inclure la base app.js
dans chaque page et présenter simplement les extensions nécessaires à chaque page ( reports.js
, home.js
, etc.), sans avoir à réviser la logique à chaque fois de bootstrapping ajouter ou quelque chose supprimer.
Existe-t-il un moyen d'introduire des dépendances lorsque l'application est déjà amorcée? Quelle est la ou les manières idiomatiques de procéder? Je penche vers cette dernière solution, mais je voulais voir si la façon dont je l'ai décrite pouvait également être réalisée. Merci.
Réponses:
Je l'ai résolu comme ceci:
référence à nouveau l'application:
puis transmettez vos nouvelles exigences au tableau des exigences:
la source
app.requires
c'est un tableau, donc si vous ajoutez plusieurs dépendances (comme dans votre exemple Reports), vous les passez en tant qu'arguments séparés à lapush
méthode:app.requires.push('ui.event', 'ngResource');
ou si vos dépendances supplémentaires sont déjà un tableau:Array.prototype.push.apply(app.requires, ['ui.event', 'ngResource'])
Simple ... Obtenez une instance du module en utilisant le getter comme ceci: var app = angular.module ("App");
Puis ajoutez à la collection "requires" comme ceci: app.requires [app.requires.length] = "ngResource";
Quoi qu'il en soit, cela a fonctionné pour moi. BONNE CHANCE!
la source
Selon cette proposition sur le groupe Google Angular JS, cette fonctionnalité n'existe pas pour le moment. J'espère que l'équipe de base décide d'ajouter cette fonctionnalité et pourra l'utiliser moi-même.
la source
Si vous souhaitez ajouter plusieurs dépendances à la fois, vous pouvez les transmettre en push comme suit:
la source
Je me rends compte que c'est une vieille question, cependant, aucune réponse de travail n'a encore été fournie, alors j'ai décidé de partager comment je l'ai résolue.
La solution nécessite de forger Angular, vous ne pouvez donc plus utiliser CDN. Cependant, la modification est très petite, je suis donc surpris de savoir pourquoi cette fonctionnalité n'existe pas dans Angular.
J'ai suivi le lien vers les groupes Google qui a été fourni dans l' une des autres réponses à cette question. Là, j'ai trouvé le code suivant, qui a résolu le problème:
Lorsque j'ai ajouté ce code à la ligne 4414 dans le code source angulaire 1.5.0 (à l'intérieur de la
createInjector
fonction, avant l'return instanceInjector;
instruction), cela m'a permis d'ajouter des dépendances après le démarrage comme celui-ci$injector.loadNewModules(['ngCookies']);
.la source
Depuis la version 1.6.7, il est désormais possible de charger les modules paresseux après le démarrage de l'application à l'aide de
$injector.loadNewModules([modules])
. Voici un exemple tiré de la documentation AngularJS:Veuillez lire la documentation complète sur loadNewModules car il y a des pièges autour de lui.
Il existe également un très bon exemple d'application d'Omkadiri qui l' utilise avec ui-router.
la source