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 controllerCidadesListaControllere pela view/views/cidades/lista.html;/cidades/editor: tratada pelo controllerCidadesEditorControllere 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.