Estou usando o template angular-seed para estruturar meu aplicativo. Inicialmente, coloquei todo o meu código JavaScript em um único arquivo main.js
,. Este arquivo continha minha declaração de módulo, controladores, diretivas, filtros e serviços. O aplicativo funciona bem assim, mas estou preocupado com a escalabilidade e manutenção, pois meu aplicativo se torna mais complexo. Percebi que o modelo angular-seed tem arquivos separados para cada um deles, então tentei distribuir meu código de um único main.js
arquivo em cada um dos outros arquivos mencionados no título para esta questão e encontrados no app/js
diretório do angular modelo de sementes .
Minha pergunta é: como faço para gerenciar as dependências para fazer o aplicativo funcionar? A documentação existente encontrada aqui não é muito clara a esse respeito, pois cada um dos exemplos fornecidos mostra um único arquivo-fonte JavaScript.
Um exemplo do que tenho é:
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...
}
]);
filtros.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
}
Como faço para gerenciar as dependências?
Desde já, obrigado.
fonte
angular.module('myApp.services', ['myApp.services']);
no app.js sem sorte.angular.module('myApp.services', ['myApp.server', 'myApp.somethingElse'])
.angular.module('myApp.service1', ['myApp.service1', 'myApp.service2'])
originalmente. Caso contrário, eu não teria incluído myApp.services como sua própria dependência.Respostas:
O problema é causado por você "redeclarar" o módulo do aplicativo em todos os seus arquivos separados.
Esta é a aparência da declaração do módulo do app (declaração não certa é o termo correto):
Esta é a aparência de atribuição (não tenho certeza se atribuição é o termo correto) para seu módulo de aplicativo:
Observe a falta de colchetes.
Portanto, a versão anterior, aquela com colchetes, deve ser usada apenas uma vez, geralmente em seu
app.js
oumain.js
. Todos os outros arquivos associados - controladores, diretivas, filtros ... - devem usar a última versão, aquela sem os colchetes.Espero que faça sentido. Felicidades!
fonte
myApp
. No meu arquivo app.js, criei uma var para ele.var myApp = angular.module('myApp', []);
Em todos os outros arquivos, simplesmente me referi a esta var (por exemplo,myApp.filter('myFilter', function(MyService) { /* filter code */ });
desde que eu tenha adicionado os nomes dos arquivos nas tags de script no meu html, não precisei declarar nenhum outro dependências. O modelo de projeto angular-seed é bastante confuso a este respeito.myApp
, de modo que agora é um módulo anônimo emapp.js
:angular.module('myApp', ['myApp.filters', 'myApp.services', 'myApp.directives', 'myApp.controllers']);
. Em todos os outros arquivos também declarei módulos anônimos como esteangular.module('myApp.filter', []).filter('myFilter', function(MyService) { /* filter code */ });
. Meu aplicativo agora também funciona assim. Eu examinei meu histórico de código e não consigo ver onde isso é diferente do que quando não funcionava.angular.module('myApp', []);
(observe os colchetes) em meu arquivo js principal. Então, todos os outros arquivos se referem ao módulo usando a sintaxeangular.module('myApp').controller
ou.directive
.ngCookies
,ngResource
) quando declarar o seu módulo principal app:angular.module('myApp', []);
ngResource
é definitivamente um daqueles que você coloca nos colchetes de declaração do módulo. Se minha resposta ajudasse, votar e aprovar seria muito apreciado.Se você deseja colocar diferentes partes do seu aplicativo (
filters, services, controllers
) em arquivos físicos diferentes, há duas coisas que você deve fazer:app.js
ou em cada arquivo;Então, você
app.js
ficaria assim:E em cada arquivo individual:
services.js
controllers.js
Tudo isso pode ser combinado em uma chamada:
controllers.jsO importante é que você não deve redefinir
angular.module('myApp')
; isso faria com que fosse sobrescrito quando você instanciar seus controladores, provavelmente não o que você deseja.fonte
Você obtém o erro porque ainda não definiu
myApp.services
. O que fiz até agora foi colocar todas as definições iniciais em um arquivo e depois usá-las em outro. Como para o seu exemplo, eu colocaria:app.js
Isso deve eliminar o erro, embora eu ache que você deva ler o artigo Eduard Gamonal mencionado em um dos comentários.
fonte
angular.module('myApp.services', []);
ao meu arquivo app.js. Nenhum dos dois realmente resolve meu problema.