angularjs, определяющий службы для одного и того же модуля в разных файлах

У меня есть два файла, в которых я определяю службы в моем приложении angular, но когда я пытаюсь использовать их оба в своей директиве, я получаю сообщение об ошибке, в котором говорится, что поставщик услуг не найден для той директивы, которую я определяю второй. Похоже, что одна служба перезаписывает другую. Если я изменю определение модуля в service2.js на myapp.services2, то все заработает. Я бы подумал, что таким образом можно добавить несколько фабрик в один и тот же модуль. Может кто указать, что я делаю неправильно?

service1.js:

var services = angular.module('myapp.services',[]);
services.factory('Service1', function() {
    // service code
});

service2.js:

var services = angular.module('myapp.services',[]);
services.factory('Service2', function() {
    // service code
});

mydirective.js:

angular.module('myappdirective', []).directive('myapp', ['Service1', 'Service2',
function(service1,service2) {
    // directive code
}]);

person Jeff Storey    schedule 30.04.2014    source источник
comment
Вы дважды определяете модуль служб. Вам нужно определить его только один раз (в одном файле). В моем последнем проекте я переместил строку var services = angular.module в отдельный файл js (уж точно излишний).   -  person aet    schedule 30.04.2014
comment
Разве это не должно поискать его во второй раз, а не переопределять его?   -  person Jeff Storey    schedule 30.04.2014
comment
Если вы удалите массив инъекций, я думаю, он будет работать именно так - angular.module ('myapp.services');   -  person aet    schedule 30.04.2014
comment
Я попробую, но почему это должно работать (здесь новичок в angular)   -  person Jeff Storey    schedule 30.04.2014
comment
Ха! Просто так они это построили. Это из документации: помните, что использование angular.module ('myModule', []) создаст модуль myModule и перезапишет любой существующий модуль с именем myModule. Используйте angular.module ('myModule'), чтобы получить существующий модуль.   -  person aet    schedule 30.04.2014
comment
Итак, в первый раз, когда я определяю это, мне нужно использовать [], а во второй раз - нет? Кажется хрупким ...   -  person Jeff Storey    schedule 30.04.2014
comment
Да, это правильно. Я пока не обнаружил, что это слишком плохо (с точки зрения хрупкости).   -  person aet    schedule 30.04.2014
comment
Значит, имеет значение порядок включения скриптов?   -  person Santosh    schedule 28.07.2016


Ответы (2)


Это из документов:

Помните, что использование angular.module ('myModule', []) создаст модуль myModule и перезапишет любой существующий модуль с именем myModule. Используйте angular.module ('myModule'), чтобы получить существующий модуль.

Найдено здесь: https://docs.angularjs.org/guide/module

person aet    schedule 30.04.2014
comment
Забавно, как существующая реализация сбивает с толку почти всех. angular.createModule(<module_name>, <dependencies>), angular.retrieveModule(<module_name>) не возникло бы столько вопросов! ;) Также очень сложно обнаружить ошибочное добавление [] - person Mirko; 12.09.2014
comment
Я думаю, это довольно очевидно. Я привык работать с JQuery, поэтому такие вещи, как .width() vs. .width(newWidth), довольно тривиальны, по крайней мере, для меня. К тому же он вас удивит только один раз. В следующий раз, когда вы увидите ошибку инжектора, говорящую о том, что модуль не может быть найден, вы узнаете, что сделали это снова;) - person tfrascaroli; 27.08.2015

Это возможно, но будет подвержено ошибкам, поэтому не рекомендуется.

Внесите небольшие изменения в то, что вы уже делаете

Просто не объявляйте повторно переменную модуля в других файлах, кроме service1.js, и не помещайте определение модуля в собственный файл и не включайте эти JS-файлы в порядке Module.js, services.js, directive.js, а затем буду работать

person Basav    schedule 01.04.2016