AngularJS semences: mettre du code JavaScript dans des fichiers séparés (app.js, controllers.js, directives.js, filters.js, services.js)
Je suis en utilisant le angulaire de la graine modèle pour la structure de mon application. Au départ, j'ai mis tout mon code JavaScript dans un fichier unique, main.js
. Ce fichier contenait mon module de déclaration, des contrôleurs, des directives, des filtres et des services. L'application fonctionne très bien comme ça, mais je suis inquiet sur l'évolutivité et la maintenabilité que ma demande devient de plus en plus complexe. J'ai remarqué que l'angle de graines de modèle a des fichiers distincts pour chacun d'eux, j'ai donc essayé de distribuer mon code à partir de la seule main.js
fichier dans chacun des autres fichiers mentionnés dans le titre de cette question et a trouvé dans le app/js
répertoire de la angulaire de la graine modèle.
Ma question est: comment puis-je gérer les dépendances afin d'obtenir l'application au travail? La documentation existante trouvé ici n'est pas très claire à ce sujet, puisque chacun de ces exemples montre un seul fichier source JavaScript.
Un exemple de ce que j'ai est:
app.js
angular.module('myApp',
['myApp.filters',
'myApp.services',
'myApp.controllers']);
controllers.js
angular.module('myApp.controllers', []).
controller('AppCtrl', [function ($scope, $http, $filter, MyService) {
$scope.myService = MyService; //found in services.js
//other functions...
}
]);
filters.js
angular.module('myApp.filters', []).
filter('myFilter', [function (MyService) {
return function(value) {
if (MyService.data) { //test to ensure service is loaded
for (var i = 0; i < MyService.data.length; i++) {
//code to return appropriate value from MyService
}
}
}
}]
);
services.js
angular.module('myApp.services', []).
factory('MyService', function($http) {
var MyService = {};
$http.get('resources/data.json').success(function(response) {
MyService.data = response;
});
return MyService;
}
);
main.js
/* This is the single file I want to separate into the others */
var myApp = angular.module('myApp'), []);
myApp.factory('MyService', function($http) {
//same code as in services.js
}
myApp.filter('myFilter', function(MyService) {
//same code as in filters.js
}
function AppCtrl ($scope, $http, $filter, MyService) {
//same code as in app.js
}
Comment puis-je gérer les dépendances?
Merci d'avance.
- il y a quelques articles à ce sujet. par exemple, briantford.com/blog/huuuuuge-angular-apps.html, et de certains projets, comme yeoman. thereare deux façons de procéder: la séparation des composants par des couches (comme angulaires-graine) ou par fonction, à l'instar de certains articles suggèrent.
- Lorsque vous déclarez un module par exemple angulaire.module('myApp.service1', []) je pense que vous avez besoin d'ajouter des dépendances à la [] par exemple, angulaire.module('myApp.service1', ['myApp.service2', 'myApp.service2']).. Je suis assez nouveau à AngularJS, donc j'ai peut-être tort. Si cela fonctionne, laissez-moi savoir et je vais poster une réponse.
- Où faut que la ligne sera insérée? J'ai mis
angular.module('myApp.services', ['myApp.services']);
en app.js avec pas de chance. - 1. Lorsque vous répondez aux commentaires, toujours commencer le commentaire par " @ " et le nom de l'utilisateur (sans les espaces), de sorte que l'utilisateur recevra une notification. 2. myApp.les services devraient être dépendant des autres modules, et non pas sur lui-même, par exemple,
angular.module('myApp.services', ['myApp.server', 'myApp.somethingElse'])
. - avez-vous modifier votre commentaire précédent? Je l'ai lu comme
angular.module('myApp.service1', ['myApp.service1', 'myApp.service2'])
à l'origine. Sinon, je n'aurais pas inclus myApp.des services comme sa propre dépendance. - Uniquement pour ajouter la dernière phrase.
- Alors, pourquoi voulez-vous la liste myApp.service2 deux fois? En tout cas, je ne cherche pas à ajouter des dépendances entre les services, seulement à l'application principale. Donc plus utile exemple serait exactement comme celui trouvé dans mon app.js code.
- Plus ou moins la même, il suffit d'ajouter les dépendances de l'application de la définition.
- Trouvé le problème: AppCtrl dépend MyService. Solution ajouter de la dépendance " myApp.services "à la" myApp.des contrôleurs.
- En fait, il n'est pas nécessaire d'ajouter que la dépendance tant que le fichier html listes le code source pour le service dans une balise script.
- Est-ce à dire que vous avez essayé?
- J'ai. Aucun de mes fichiers ont liste des dépendances entre les crochets. Aussi longtemps que j'utilise le contrôleur, le service, le filtre ou le nom de la directive trouvé dans leurs déclarations respectives, alors je peux utiliser n'importe où et AngularJS va les trouver (à condition que le code source contenant la référence se trouve dans une balise html script sur la page correspondante).
Vous devez vous connecter pour publier un commentaire.
Le problème est causé par vous "redeclaring" de votre module d'application dans tous vos fichiers séparés.
C'est ce que l'application du module de déclaration (pas sûr de déclaration est le bon terme) ressemble à:
C'est ce que l'affectation (pas sûr si l'affectation est le bon terme, soit à votre module d'application ressemble:
Constater l'absence de crochets.
Donc, l'ancienne version, on avec les crochets, doit être utilisé une seule fois, généralement dans votre
app.js
oumain.js
. Tous les autres fichiers associés — contrôleurs, des directives, des filtres ... — utilise la dernière version, celle sans les crochets.J'espère qu'un sens. Cheers!
Uncaught Error: No module: myApp.controllers
,Uncaught Error: No module: myApp.filters
(deux fois),Uncaught Error: No module: myApp.services
.myApp
. Dans mon app.js fichier que j'ai créé un var pour ellevar myApp = angular.module('myApp', []);
Dans tous les autres fichiers que je faisait simplement référence à cette variable (par exemple,myApp.filter('myFilter', function(MyService) { /* filter code */ });
aussi longtemps Que j'ai ajouté les noms de fichier dans les balises de script dans mon code html, je n'ai pas besoin de déclarer toutes les autres dépendances. L'angle de graines modèle de projet est assez déroutant à cet égard.myApp
, de sorte qu'il est maintenant un anonyme, un module deapp.js
:angular.module('myApp', ['myApp.filters', 'myApp.services', 'myApp.directives', 'myApp.controllers']);
. Dans tous les autres fichiers que j'ai également déclaré anonyme modulesangular.module('myApp.filter', []).filter('myFilter', function(MyService) { /* filter code */ });
. Mon application fonctionne maintenant comme cela aussi. J'ai dépassé mon code d'histoire et je ne vois pas où c'est toute différente de ce que j'quand elle n'a pas de travail.angular.module('myApp', []);
(noter les crochets) dans le principal de mon fichier js. Ensuite, tous les autres fichiers, reportez-vous au module à l'aide de laangular.module('myApp').controller
ou.directive
de la syntaxe.ngCookies
,ngResource
) lors de la déclaration de votre application principale du module:angular.module('myApp', []);
ngResource
est certainement l'un de ceux que vous placez dans votre déclaration de module entre parenthèses. Si ma réponse t'aider, le vote et l'approbation qu'il serait très apprécié.angular.module('app.submodule', ['dependency1', 'dependency2');
, comme je ne suis pas à l'aise de laisser la responsabilité du contrôleurSi vous êtes désireux de mettre vos différentes parties de votre application (
filters, services, controllers
) dans les différents fichiers physiques, il y a deux choses que vous avez à faire:app.js
ou dans chaque fichier;Donc, votre
app.js
devrait ressembler à ceci:Et dans chaque fichier:
services.js
controllers.js
Tous ces éléments peuvent être combinés en un seul appel:
controllers.js
L'important, c'est que vous ne devriez pas redéfinir
angular.module('myApp')
; que serait la cause d'être écrasées lors de l'instanciation de vos contrôleurs, probablement pas ce que vous voulez.Vous obtenez l'erreur parce que vous n'avez pas de définir
myApp.services
encore. Ce que j'ai fait jusqu'à présent est de mettre toutes les définitions initiales dans un fichier, et ensuite les utiliser dans un autre. Comme pour ton exemple, je mettrais dans:app.js
Qui devrait se débarrasser de l'erreur, mais je pense que vous devriez avoir à lire l'article Eduard Gamonal mentionné dans un des commentaires.
angular.module('myApp.services', []);
à mon app.js fichier. Ni vraiment traite de mon problème.