Как решить проблемы с зависимостями с помощью встроенного приложения AngularJS?
Я новичок в AngularJS и создаю приложение, которое будет создано с использованием Grunt.
Когда я создаю и запускаю свое приложение, я замечаю некоторые проблемы, связанные с порядком загрузки зависимостей:
Uncaught Error: [$injector:nomod] Module 'mycompany.admin.forms' is not available! You either misspelled the module name or forgot to load it. If registering a module ensure that you specify the dependencies as the second argument.
http://errors.angularjs.org/1.2.13/$injector/nomod?p0=mycompany.admin.forms
В встроенном файле приложения модуль используется до его объявления:
angular.module('mycompany.admin.forms').controller('editController', ['$scope', function($scope) {
// ...
}]);
angular.module('mycompany.admin.forms', [])
.config(['$routeProvider', function($routeProvider) {
// ...
}]);
Вот соответствующие фрагменты из моего проекта gruntfile.js:
grunt.initConfig({
distdir: 'build',
pkg: grunt.file.readJSON('package.json'),
src: {
js: ['src/**/*.js'],
},
concat: {
dist: {
src: ['<%= src.js %>', '<%= src.jsTpl %>'],
dest: '<%= distdir %>/admin/app.js'
}
}
...
});
Я знаю, что могу решить это, поставив весь источник для данного модуля в один файл; однако, я хотел бы попытаться сохранить каждую вещь (каждый контроллер, каждую службу и т.д.) в своем собственном файле.
Как я могу решить эту проблему с загрузкой зависимостей?
Ответы
Ответ 1
В каком порядке используется конкатенирование ваших файлов? Похоже, вы просто читаете директорию, и если файл javascript, в котором находится модуль, находится после файла, в котором находится контроллер, тогда конкатенированный файл будет создан в неправильном порядке.
Вероятно, самым простым решением является явно указать файл, содержащий объявление вашего модуля (с []) в качестве первого файла в вашем исходном массиве.
Ответ 2
Для решения проблем загрузки зависимостей я рекомендую использовать Require.js
Он отлично работает с Angular, а также вы grunt plugin для создания сборки.