J'utilise le modèle angular-seed pour structurer mon application. Dans un premier temps, je mets tout mon code JavaScript dans un seul fichier, main.js
. Ce fichier contenait ma déclaration de module, les contrôleurs, les directives, les filtres et les services. L'application fonctionne bien comme ça, mais je m'inquiète de l'évolutivité et de la maintenabilité car mon application devient plus complexe. J'ai remarqué que le modèle angular-seed a des fichiers séparés pour chacun d'eux, j'ai donc tenté de distribuer mon code à partir du main.js
fichier unique dans chacun des autres fichiers mentionnés dans le titre de cette question et trouvés dans le app/js
répertoire de l' angular -modèle de graine .
Ma question est la suivante: comment gérer les dépendances pour que l'application fonctionne? La documentation existante trouvée ici n'est pas très claire à cet égard puisque chacun des exemples donnés 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 gérer les dépendances?
Merci d'avance.
la source
angular.module('myApp.services', ['myApp.services']);
dans app.js sans succès.angular.module('myApp.services', ['myApp.server', 'myApp.somethingElse'])
.angular.module('myApp.service1', ['myApp.service1', 'myApp.service2'])
origine. Sinon, je n'aurais pas inclus myApp.services comme sa propre dépendance.Réponses:
Le problème est dû au fait que vous "redéclarez" votre module d'application dans tous vos fichiers séparés.
Voici à quoi ressemble la déclaration du module d'application (pas sûr que la déclaration soit le bon terme):
Voici à quoi ressemble l'affectation (pas sûr que l'affectation soit le bon terme non plus) à votre module d'application:
Remarquez l'absence de crochets.
Ainsi, l'ancienne version, une avec les crochets, ne doit être utilisée qu'une seule fois, généralement dans votre fichier
app.js
oumain.js
. Tous les autres fichiers associés - contrôleurs, directives, filtres … - doivent utiliser la dernière version, celle sans les crochets.J'espère que cela à du sens. À votre santé!
la source
myApp
. Dans mon fichier app.js, j'ai créé une variable pour celavar myApp = angular.module('myApp', []);
Dans tous les autres fichiers, je me suis simplement référé à cettemyApp.filter('myFilter', function(MyService) { /* filter code */ });
variable (par exemple, tant que j'ai ajouté les noms de fichier dans les balises de script dans mon html, je n'avais pas besoin de déclarer d'autres dépendances. Le modèle de projet angular-seed est assez déroutant à cet égard.myApp
, de sorte qu'il est maintenant un module anonymeapp.js
:angular.module('myApp', ['myApp.filters', 'myApp.services', 'myApp.directives', 'myApp.controllers']);
. Dans tous les autres fichiers, j'ai également déclaré des modules anonymes comme celui-ciangular.module('myApp.filter', []).filter('myFilter', function(MyService) { /* filter code */ });
. Mon application fonctionne maintenant aussi comme ça. J'ai parcouru mon historique de code et je ne peux pas voir en quoi cela est différent de ce que j'ai quand cela n'a pas fonctionné.angular.module('myApp', []);
(notez les crochets) dans mon fichier js principal. Ensuite, tous les autres fichiers font référence au module en utilisant la syntaxeangular.module('myApp').controller
ou.directive
.ngCookies
,ngResource
) lors de la déclaration de votre module principal de l' application:angular.module('myApp', []);
ngResource
est certainement l'un de ceux que vous placez dans les crochets de déclaration de votre module. Si ma réponse vous a aidé, voter et approuver cela serait très apprécié.Si vous souhaitez placer vos différentes parties de votre application (
filters, services, controllers
) dans différents fichiers physiques, vous devez faire deux choses:app.js
ou dans chaque fichier;Donc, vous
app.js
ressembleriez à ceci:Et dans chaque dossier individuel:
services.js
controllers.js
Tout cela peut être combiné en un seul appel:
controllers.jsL'important est que vous ne devriez pas redéfinir
angular.module('myApp')
; cela entraînerait son écrasement lorsque vous instanciez vos contrôleurs, probablement pas ce que vous voulez.la source
Vous obtenez l'erreur car vous n'avez pas
myApp.services
encore défini . Ce que j'ai fait jusqu'à présent, c'est de mettre toutes les définitions initiales dans un fichier, puis de les utiliser dans un autre. Comme pour votre exemple, je mettrais:app.js
Cela devrait éliminer l'erreur, même si je pense que vous devriez lire l'article Eduard Gamonal mentionné dans l'un des commentaires.
la source
angular.module('myApp.services', []);
à mon fichier app.js. Ni l'un ni l'autre ne résout vraiment mon problème.