Módulo ngRoute
O ngRoute
é um módulo do Angular utilizado para fornecer o serviço de rota para aplicativos baseados no Angular. Uma rota é um recurso que permite interpretar a URL conforme certos padrões. Detalhes sobre isso serão vistos nesta seção.
Para utilizar o ngRoute
é necessários instalá-lo, já que ele não é distribuído, por padrão, com o Angular. Para isso, esta seção introduz a utilização do npm
, gerenciador de pacotes do NodeJS. Acesse a pasta do aplicativo via prompt (linha de comando) e execute o comando:
npm init -y
Isso fará com o que o projeto seja iniciado e esteja inicialmente configurado para utilizar o npm
e os componentes do Angular.
Instale o Angular:
npm install angular --save
Instale o "Angular route", que fornece o módulo ngRoute
:
npm install angular-route --save
A partir de agora, ao invés de utilizar o Angular de uma CDN (bem como outros componentes) utilize o que está na pasta node_modules
.
Estrutura do aplicativo
O aplicativo app-cidades-route
usa o app-cidades-http
com base. As principais diferenças estão na arquitetura da solução e quanto aos recursos do Angular utilizados.
Em relação à arquitetura o aplicativo tem a seguinte estrutura de arquivos:
+ app-cidades-route
+--- dados
| +--- cidades.json
| +--- estados.json
+--- views
| +--- cidades
| +--- editor.html
| +--- lista.html
+--- app.js
+--- index.html
A pasta dados
contém os arquivos de dados do aplicativo (cidades.json
e estados.json
). A pasta views
contém as views do aplicativo. Neste caso, o aplicativo está organizado por contexto, de modo que a pasta cidades
contém os arquivos editor.html
e lista.html
que representam, respectivamente, o formulário de cadastro e a lista de cidades. Os demais arquivos são similares ao utilizado anteriormente (app.js
e index.html
).
Além da organização dos arquivos, o aplicativo, representado pelo módulo cidades
, utiliza o módulo ngRoute
como dependência.
Configurando as rotas
A configuração das rotas é feita na função config()
do módulo:
angular.module('cidades', ['ngRoute'])
.config(
function($routeProvider){
$routeProvider
.when('/cidades', {
templateUrl: 'views/cidades/lista.html',
controller: 'CidadesListaController'
})
.when('/cidades/editor', {
templateUrl: 'views/cidades/editor.html',
controller: 'CidadesEditorController'
})
.when('/cidades/:id/editor', {
templateUrl: 'views/cidades/editor.html',
controller: 'CidadesEditorController'
})
.otherwise({
redirectTo: '/cidades'
});
}
);
O parâmetro da função config()
, $routeProvider
, representa o objeto que dá acesso às configurações de rotas. Uma rota é configurada na chamada do método when()
, que recebe como parâmetros:
- a rota (representada por uma string); e
- um objeto que indica qual template será utilizado (atributo
templateUrl
) e qual controller (atributocontroller
).
Neste caso, o aplicativo trata três rotas:
/cidades
: tratada pelo controllerCidadesListaController
e pela view/views/cidades/lista.html
;/cidades/editor
: tratada pelo controllerCidadesEditorController
e pela view/views/cidades/editor.html
;/cidades/:id/editor
: tratada da mesma forma que a rota anterior, com a diferença que esta rota possui um parâmetro chamadoid
.
Além disso, se nenhuma destas rotas for atendida, a função otherwise()
indica o que tem que ser feito. Neste caso, ela indica que será feito um redirecionamento para /cidades
.
CidadesListaController
O controller CidadesListaController
é responsável por listar as cidades e dar acesso às funções de exclusão e edição:
angular.module('cidades').controller('CidadesListaController',
function($scope, $http, $location){
$http.get('dados/cidades.json').success(function(dados){
$scope.cidades = dados;
});
$scope.excluir = function(index) {
if (confirm('Tem certeza que deseja excluir esta cidade?')) {
$scope.cidades.splice(index, 1);
}
};
$scope.editar = function(index) {
$location.path('/cidades/' + index + '/editor');
}
});
Neste caso, na lista de dependências do controller, além do serviço $http
, está sendo utilizado o serviço $location
. $location
é o serviço que permite manipular a barra de endereços do navegador. O código é praticamente o mesmo do que já foi visto no aplicativo app-cidades-http
, com a diferença de que a função editar()
usa o serviço $location
para navegar para o editor de cidades. Isso é feito com a chamada da função path()
, que recebe como parâmetro uma string que representa a nova rota. Neste caso, a nova rota será /cidades/<id>/editor
(onde <id>
representa o parâmetro index
-- o índice da cidade na lista de cidades).
CidadesEditorController
O controller CidadesEditorController
realiza a função de cadastro (nova cidade e editar cidade). Como os dados estão sendo armazenados em um arquivo estático (/dados/cidades.json
) o aplicativo não insere, altera ou exclui dados, específicamente (não que isso não seja possível):
angular.module('cidades').controller('CidadesEditorController',
function($scope, $http, $routeParams, $location){
$http.get('dados/estados.json').success(function(dados){
$scope.estados = dados;
});
$http.get('dados/cidades.json').success(function(dados){
$scope.cidades = dados;
if ($routeParams.id) {
$scope.cidade = $scope.cidades[$routeParams.id];
}
});
$scope.salvar = function(cidade) {
$location.path('/cidades');
};
$scope.cancelar = function() {
$location.path('/cidades');
};
});
Na lista de dependências estão: $scope
, o serviço $http
, o serviço $routeParams
(que dá acesso aos parâmetros da rota) e $location
. Como o parâmetro da rota em questão chama-se id
, o mesmo é acessado por meio de $routeParams.id
. Neste caso, no momento em que os dados do arquivo /dados/cidades.json
são carregados, a cidade atual recebe a cidade cujo índice do vetor de cidades corresponde ao id
.
As funções salvar()
e cancelar()
modificam a rota para que o aplicativo apresenta a lista de cidades novamente, por meio da função $location.path()
.
Para executar o aplicativo de exemplo que acompanha este material (app-cidaes-route
) clone o repositório de códigos-fonte de exemplo (branch gh-pages
) e, no diretório /angularjs/app-cidades-route
, execute o comando:
npm install
Isso fará com que os módulos necessários para o funcionamento do aplicativo sejam devidamente instalados.
Posteriormente, acesse o aplicativo via servidor HTTP local.