Как решить проблемы с зависимостями с помощью встроенного приложения 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 для создания сборки.