AngularJS seed: помещение JavaScript в отдельные файлы (приложение.Яш, контроллеры.Яш, директивы.js, фильтры.Яш, услуги.js)
я использую угловые-семя шаблон для структура моего приложения. Первоначально я поместил весь свой код JavaScript в один файл, main.js
. Этот файл содержал мое объявление модуля, контроллеры, директивы, фильтры и службы. Приложение работает отлично, как это, но я беспокоюсь о масштабируемости и ремонтопригодности, как мое приложение становится все более сложным. Я заметил, что шаблон angular-seed имеет отдельные файлы для каждого из них, поэтому я попытался распространить мой код из сингла main.js
файл в каждый из других файлов, упомянутых в заголовке этого вопроса и найденных в на angular-seed шаблон.
мой вопрос: как мне управлять зависимостями, чтобы заставить приложение работать? Существующая документация найдена здесь не очень ясно в этом отношении, так как каждый из приведенных примеров показывает один исходный файл JavaScript.
пример того, что у меня есть это:
приложение.js
angular.module('myApp',
['myApp.filters',
'myApp.services',
'myApp.controllers']);
контроллеры.js
angular.module('myApp.controllers', []).
controller('AppCtrl', [function ($scope, $http, $filter, MyService) {
$scope.myService = MyService; // found in services.js
// other functions...
}
]);
фильтры.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
}
}
}
}]
);
услуги.js
angular.module('myApp.services', []).
factory('MyService', function($http) {
var MyService = {};
$http.get('resources/data.json').success(function(response) {
MyService.data = response;
});
return MyService;
}
);
главная.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
}
как управлять зависимостями?
спасибо заранее.
3 ответа:
проблема вызвана тем, что вы" повторно объявляете " свой модуль приложения во всех ваших отдельных файлах.
вот как выглядит объявление модуля приложения (не уверен, что объявление является правильным термином):
angular.module('myApp', []).controller( //...
это то, что назначение (не уверен, что назначение является правильным термином либо) для вашего модуля приложения выглядит так:
angular.module('myApp').controller( //...
обратите внимание на отсутствие квадратных скобок.
Итак, прежняя версия, одна С квадрат скобки, должны использоваться только один раз, как правило, в вашем
app.js
илиmain.js
. Все другие связанные файлы - контроллеры, директивы, фильтры ... - следует использовать последнюю версию, тот без квадратные скобки.Я надеюсь, что имеет смысл. Ура!
если вы хотите поместить ваши различные части вашего приложения (
filters, services, controllers
) в разных физических файлах есть две вещи, которые вы должны сделать:
- объявите эти пространства имен (за неимением лучшего термина) в вашем
app.js
или в каждом файле;- обратитесь к этим пространствам имен в каждом из файлов.
Итак, ваша
app.js
будет выглядеть так:angular.module('myApp', ['external-dependency-1', 'myApp.services', 'myApp.controllers']) .run(function() { //... }) .config(function() { //... });
и в каждом отдельном файл:
услуги.js
angular.module('myApp.services', []); //instantiates angular.module('myApp.services') //gets .factory('MyService', function() { return {}; });
контроллеры.js
angular.module('myApp.controllers', []); //instantiates angular.module('myApp.controllers') //gets .controller('MyCtrl', function($scope) { //snip... }) .controller('AccountCtrl', function($scope) { //snip... });
все это можно объединить в один вызов:
контроллеры.jsangular.module('myApp.controllers', []) .controller('MyCtrl', function($scope) { //snip... });
важная часть заключается в том, что вы не должны переопределять
angular.module('myApp')
;, что приведет к его перезаписи при инициализации контроллеров, вероятно, не то, что вы хотите.
Вы получаете ошибку, потому что вы не определили
myApp.services
пока. То, что я сделал до сих пор, - это поместить все начальные определения в один файл, а затем использовать их в другом. Как для вашего примера я бы вставил:приложение.js
angular.module('myApp.services', []); angular.module('myApp', ['myApp.services', ...]);
Это должно избавиться от ошибки, хотя я думаю, что вы должны прочитать статью Эдуард Гамонал упоминал в одном из комментариев.