Controladores AngularJS com exemplo de ng-Controller
โก Resumo Inteligente
Um Controller em AngularJS contรฉm a lรณgica de negรณcios de uma tela. Ele recebe dados atravรฉs do objeto scope, os processa e expรตe o resultado de volta para a view, mantendo-a atualizada.ping Apresentaรงรฃo em formato HTML, livre de lรณgica de aplicaรงรฃo.

O que รฉ controlador em AngularJS?
A Responsรกvel pelo Tratamento Em AngularJS, o componente recebe os dados da View, processa-os e os envia para a View, que รฉ exibida ao usuรกrio final. O Controller, por sua vez, contรฉm a lรณgica principal do seu negรณcio. Ele utiliza o modelo de dados, realiza o processamento necessรกrio e, em seguida, passa o resultado para a View.
โ ๏ธ Nota de versรฃo: O AngularJS (versรฃo 1.x) chegou ao fim de seu ciclo de vida em 31 de dezembro de 2021 e nรฃo receberรก mais atualizaรงรตes de seguranรงa. Os conceitos abaixo ainda se aplicam a aplicaรงรตes legadas; no Angular moderno, a mesma funรงรฃo รฉ desempenhada por uma classe de componente em vez de um controlador.
Saber o que รฉ um controlador deixa uma questรฃo em aberto: como ele se comunica com a visualizaรงรฃo? A prรณxima seรงรฃo responde a essa pergunta.
O que o Controller faz na perspectiva do Angular
Segue abaixo uma definiรงรฃo simples do funcionamento de um Controller do AngularJS:

- A principal responsabilidade do controlador รฉ controlar os dados que sรฃo passados โโpara a visualizaรงรฃo. O escopo e a visรฃo tรชm comunicaรงรฃo bidirecional.
- As propriedades e eventos de visualizaรงรฃo podem chamar funรงรตes no escopo. O trecho de cรณdigo abaixo mostra isso. funรงรฃo($escopo) declarado com o controlador mais uma funรงรฃo interna que retorna
$scope.firstNamee$scope.lastNameentrou. Em AngularJSUma funรงรฃo definida como uma variรกvel รฉ um mรฉtodo.
- Os dados sรฃo transmitidos do controlador para o escopo e, em seguida, alternadamente entre o escopo e a visualizaรงรฃo.
- O escopo expรตe o modelo ร visualizaรงรฃo. O modelo pode ser modificado por meio de mรฉtodos definidos no escopo, que sรฃo acionados por eventos da visualizaรงรฃo.
- Os controladores nรฃo devem ser usados โโpara manipular o DOM. Essa รฉ a funรงรฃo dos... directivas.
- A melhor prรกtica รฉ basear os controladores na funcionalidade. Se vocรช tem um formulรกrio de entrada que precisa de um controlador, crie um chamado "controlador de formulรกrio".
Com o mecanismo compreendido, a prรณxima seรงรฃo constrรณi um controlador a partir de uma pรกgina em branco.
Como construir um controlador bรกsico em AngularJS
A seguir estรฃo os passos para criar um controlador em AngularJS.
Etapa 1) Crie uma pรกgina HTML bรกsica
Antes de criar um controlador, a pรกgina HTML bรกsica precisa estar pronta. O trecho de cรณdigo abaixo รฉ uma pรกgina simples intitulada "Inscriรงรฃo para Evento" que faz referรชncia a Bootstrap e AngularJS.
- Referรชncias ao Bootstrap Folha de estilo CSS, usada em conjunto com o Bootstrap biblioteca.
- Uma referรชncia ร biblioteca AngularJS. Tudo o que for feito com AngularJS a partir deste ponto serรก resolvido a partir deste arquivo.
- Uma referรชncia ao Bootstrap biblioteca, que torna certos controles responsivos.
โ ๏ธ Correรงรฃo: O cรณdigo original carregava o jQuery e afirmava que o AngularJS dependia dele. Isso nรฃo รฉ verdade. O AngularJS รฉ distribuรญdo com o jqLite, um subconjunto integrado da API do jQuery, e sรณ atualiza para o jQuery completo se o jQuery for carregado corretamente. antes A referรชncia foi removida.
Etapa 2) Verifique os arquivos e a estrutura dos arquivos
- Os arquivos sรฃo divididos em duas pastas, como em qualquer aplicaรงรฃo web convencional: โcssโ para folhas de estilo e โlibโ para cรณdigo. JavaScript arquivos.
- O arquivo bootstrap.css fica na pasta css e รฉ responsรกvel pela aparรชncia e funcionalidade do site.
- O angular.js รฉ a biblioteca principal, baixada do site do AngularJS e armazenada na pasta lib.
- O arquivo app.js conterรก o cรณdigo dos controladores.
Etapa 3) Use o cรณdigo AngularJS para exibir a saรญda
O objetivo aqui รฉ exibir as palavras "AngularJS" tanto como texto simples quanto dentro de uma caixa de texto quando a pรกgina for aberta no navegador.
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Event Registration</title> <link rel="stylesheet" href="css/bootstrap.css"> </head> <body> <h1> Guru99 Global Event</h1> <div ng-app="DemoApp" ng-controller="DemoController"> Tutorial Name : <input type="text" ng-model="tutorialName"><br> This tutorial is {{tutorialName}} </div> <script src="lib/angular.js"></script> <script> var app = angular.module('DemoApp', []); app.controller('DemoController', ['$scope', function($scope) { $scope.tutorialName = "AngularJS"; }]); </script> </body> </html>
Code Explicaรงรฃo:
- aplicativo ng marca este elemento como a raiz de uma aplicaรงรฃo AngularJS. Atributos com o prefixo ng- Sรฃo diretivas integradas. โDemoAppโ รฉ o nome dado ao aplicativo.
- A div carrega controlador ng com o nome โDemoControllerโ, que dรก a esse elemento e a tudo o que estรก dentro dele acesso ao escopo do controlador.
- modelo ng Cria a vinculaรงรฃo do modelo, associando a caixa de texto "Nome do Tutorial" ร propriedade de escopo.
tutorialName. - O mรณdulo
DemoAppรฉ criado e o controlador atribui um valor padrรฃo de โAngularJSโ atutorialName.
โ ๏ธ Correรงรตes aplicadas. O anรบncio original declarava chrset="UTF 8", que nรฃo รฉ um atributo vรกlido nem um nome de codificaรงรฃo vรกlido, e carregou o AngularJS duas vezes โ uma vez da CDN e outra de lib/angular.jsCarregar a biblioteca duas vezes registra novamente o sistema de mรณdulos e produz um comportamento imprevisรญvel. A anotaรงรฃo de matriz de dependรชncias ['$scope', function($scope){โฆ}] Tambรฉm foi adicionado, sem o qual o controlador para de funcionar no momento em que o arquivo รฉ minificado.
Saรญda:
Porque tutorialName Foi atribuรญdo o valor โAngularJSโ, e esse valor aparece na caixa de texto e na linha de texto simples. Uma รบnica propriedade รฉ suficiente para uma demonstraรงรฃo; controladores reais geralmente tambรฉm expรตem comportamentos, o que serรก abordado na prรณxima seรงรฃo.
Como definir mรฉtodos em controladores AngularJS
Normalmente, define-se vรกrios mรฉtodos em um controlador para separar a lรณgica de negรณcios. Se o controlador tivesse que somar dois nรบmeros e subtrair o resultado, por exemplo, usaria um mรฉtodo para cada nรบmero.tracPara dois nรบmeros, vocรช criaria um mรฉtodo para cada operaรงรฃo.
O exemplo abaixo define um mรฉtodo personalizado dentro de um controlador AngularJS que retorna uma string.
<!-- The head and library references are unchanged from Step 3 --> <div ng-app="DemoApp" ng-controller="DemoController"> Tutorial Name : <input type="text" ng-model="tutorialName"><br> This tutorial is {{tName()}} </div> <script> var app = angular.module('DemoApp', []); app.controller('DemoController', ['$scope', function($scope) { $scope.tutorialName = "AngularJS"; // A method on the scope, callable from the view as tName() $scope.tName = function() { return $scope.tutorialName; }; }]); </script>
Code Explicaรงรฃo:
- Uma funรงรฃo รฉ associada ao objeto de escopo como membro.
tNameRetorna o valor atual detutorialName. - A visualizaรงรฃo chama o mรฉtodo com
{{tName()}}Os parรชnteses sรฃo importantes: sem eles, a expressรฃo imprime a prรณpria funรงรฃo em vez de seu resultado.
โ ๏ธ Correรงรฃo: o mรฉtodo original lia $scope.tName = function() { return $scope.tName; };Essa funรงรฃo retorna a si mesma, e nรฃo o nome do tutorial, entรฃo a pรกgina renderizou o corpo da funรงรฃo em vez do texto. Agora ela retorna $scope.tutorialName.
Saรญda:
Atรฉ agora, tudo estava em um รบnico arquivo. Os aplicativos de produรงรฃo mantรชm os controladores separados, o que serรก demonstrado na prรณxima seรงรฃo.
Exemplo de controlador AngularJS com ng-Controller
O exemplo "HelloWorld" acima colocou toda a funcionalidade em um รบnico arquivo. Agora รฉ hora de mover o cรณdigo do controlador para seu prรณprio arquivo.
Passo 1) No arquivo app.js, adicione o seguinte cรณdigo ao seu controlador.
angular.module('app', []) .controller('HelloWorldCtrl', ['$scope', function($scope) { $scope.message = "Hello World"; }]);
O cรณdigo acima faz o seguinte:
- Define um mรณdulo chamado โappโ que contรฉm o controlador.
- Cria um controlador chamado โHelloWorldCtrlโ que exibe a mensagem โOlรก Mundoโ.
- Utiliza o objeto de escopo para passar informaรงรตes do controlador para a visualizaรงรฃo, neste caso, uma variรกvel chamada
message.
Passo 2) No arquivo Sample.html, adicione uma div contendo a diretiva ng-controller e uma referรชncia ร variรกvel membro. messageLembre-se de fazer referรชncia ao arquivo app.js, que contรฉm o cรณdigo-fonte do controlador.
<!DOCTYPE html> <html ng-app="app"> <head> <meta charset="UTF-8"> <title>Event Registration</title> <link rel="stylesheet" href="css/bootstrap.css"> </head> <body> <h1> Guru99 Global Event</h1> <div class="container"> <div ng-controller="HelloWorldCtrl">{{message}}</div> </div> <script src="lib/angular.js"></script> <script src="app.js"></script> </body> </html>
โ ๏ธ Correรงรฃo: O arquivo app.js precisa ser carregado. depois de angular.js, jรก que ele chama angular.moduleO original tambรฉm carregava a biblioteca duas vezes e continha o mesmo chrset erro de digitaรงรฃo.
Saรญda:
Todos os exemplos atรฉ agora leram e escreveram propriedades diretamente em $scopeA seรงรฃo abaixo aborda a alternativa recomendada pela equipe do AngularJS.
Como usar a sintaxe `controllerAs` no AngularJS
Ligaรงรฃo direta a $scope Funciona, mas torna-se ambรญguo assim que os controladores sรฃo aninhados. Uma expressรฃo de visualizaรงรฃo como {{name}} Nรฃo dรก nenhuma pista sobre qual controlador รฉ o dono. nameE como os escopos filhos herdam prototipicamente dos escopos pais, um controlador aninhado que escreve em um primitivo herdado cria silenciosamente sua prรณpria cรณpia sombra. controllerAs A sintaxe resolve ambos os problemas, atribuindo um alias a cada controlador.
Passo 1) Dรช um alias ao controlador na visualizaรงรฃo usando o as palavra-chave e, em seguida, prefixe cada associaรงรฃo com esse alias.
Passo 2) Dentro do controlador, associe propriedades a this em vez de $scope.
<div ng-controller="DemoController as demo"> Tutorial Name : <input type="text" ng-model="demo.tutorialName"> This tutorial is {{demo.tutorialName}} </div> <script> app.controller('DemoController', function() { // 'vm' is captured so nested functions keep the right reference var vm = this; vm.tutorialName = "AngularJS"; vm.tName = function() { return vm.tutorialName; }; }); </script>
Seguem-se trรชs vantagens. As encadernaรงรตes tornam-se autodocumentadas, porque demo.tutorialName nomeia seu proprietรกrio. Controladores aninhados param de colidir, jรก que um pai possui um alias. outer e uma crianรงa com outro nome inner ambos podem expor nameOs valores tambรฉm sรฃo vinculados por meio de um objeto em vez de um tipo primitivo simples, contornando essa limitaรงรฃo.ping A armadilha em que uma ediรงรฃo feita em um processo filho nunca chega ao processo pai.
๐ก Dica: Capture this em uma variรกvel como vm na parte superior do controlador. Dentro de um retorno de chamada, this refere-se a algo completamente diferente, e a referรชncia capturada mantรฉm a vinculaรงรฃo correta.
Escolher um estilo de vinculaรงรฃo รฉ uma decisรฃo. Decidir o que deve estar presente em um controlador รฉ outra, e a comparaรงรฃo abaixo traรงa essa linha divisรณria.
Controlador versus Serviรงo no AngularJS
Iniciantes frequentemente sobrecarregam o controlador com tarefas que deveriam ser executadas por um serviรงo. A distinรงรฃo reside no ciclo de vida e na reutilizaรงรฃo: um controlador existe apenas enquanto sua visualizaรงรฃo estรก na tela, enquanto um serviรงo รฉ um singleton que existe durante toda a vida รบtil da aplicaรงรฃo.
| Aspecto | Responsรกvel pelo Tratamento | Serviรงo |
|---|---|---|
| Lifetime | Criado e destruรญdo com a vista | Instรขncia รบnica para toda a aplicaรงรฃo |
| Propรณsito | Preparar dados para uma visualizaรงรฃo | Lรณgica compartilhada, estado e chamadas de servidor |
| Reutilizรกvel | Nรฃo, estรก ligado ร sua vista. | Sim, injetรกvel em qualquer lugar. |
| Mantรฉm o estado entre visualizaรงรตes. | Nรฃo, o estado estรก perdido na navegaรงรฃo. | Sim, o estado persiste. |
| Conteรบdo tรญpico | Propriedades de escopo e mรฉtodos de visualizaรงรฃo | Chamadas HTTP, armazenamento em cache, regras de negรณcio |
Mantenha os controladores enxutos. Se dois controladores precisam da mesma lรณgica, ou se um valor precisa sobreviver ร navegaรงรฃo entre telas, mova-o para um serviรงo e injete esse serviรงo onde for necessรกrio. Um teste prรกtico รฉ verificar se o cรณdigo ainda faria sentido com a tela atual fechada. Se a resposta for sim, ele pertence a um serviรงo.










