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.

  • ๐ŸŽฏ Responsabilidade principal: Um controlador preenche o objeto de escopo e expรตe mรฉtodos para a visualizaรงรฃo; ele nรฃo manipula o DOM.
  • ๐Ÿ”— Fiaรงรฃo: A diretiva ng-controller vincula um controlador nomeado a um elemento, dando a esse elemento e aos seus filhos acesso ao escopo do controlador.
  • ๐Ÿ” Encadernaรงรฃo bidirecional: O ng-model vincula um campo de formulรกrio a uma propriedade de escopo, de modo que as ediรงรตes na visualizaรงรฃo atualizam o controlador e vice-versa.
  • ๐Ÿงฉ Mรฉtodos: As funรงรตes associadas ao escopo separam partes distintas da lรณgica e podem ser chamadas diretamente a partir de expressรตes de visualizaรงรฃo.
  • ๐Ÿท๏ธ Sintaxe do controlador: Atribuir um alias a um controlador e vinculรก-lo a this Elimina a ambiguidade quando os controladores estรฃo aninhados uns dentro dos outros.
  • ๐Ÿ“ Separaรงรฃo: Mover os controladores para um arquivo app.js dedicado mantรฉm a camada de visualizaรงรฃo independente da camada lรณgica.

Controladores AngularJS com ng-controller

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:

Funcionamento do controlador AngularJS
Funcionamento do controlador 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.firstName e $scope.lastName entrou. Em AngularJSUma funรงรฃo definida como uma variรกvel รฉ um mรฉtodo.

Funcionamento do controlador AngularJS

  • 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.

Construa um controlador bรกsico em AngularJS

  1. Referรชncias ao Bootstrap Folha de estilo CSS, usada em conjunto com o Bootstrap biblioteca.
  2. Uma referรชncia ร  biblioteca AngularJS. Tudo o que for feito com AngularJS a partir deste ponto serรก resolvido a partir deste arquivo.
  3. 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

Construa um controlador bรกsico em AngularJS

  1. 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.
  2. O arquivo bootstrap.css fica na pasta css e รฉ responsรกvel pela aparรชncia e funcionalidade do site.
  3. O angular.js รฉ a biblioteca principal, baixada do site do AngularJS e armazenada na pasta lib.
  4. 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.

Construa um controlador bรกsico em AngularJS

<!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:

  1. 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.
  2. 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.
  3. modelo ng Cria a vinculaรงรฃo do modelo, associando a caixa de texto "Nome do Tutorial" ร  propriedade de escopo. tutorialName.
  4. O mรณdulo DemoApp รฉ criado e o controlador atribui um valor padrรฃo de โ€œAngularJSโ€ a tutorialName.

โš ๏ธ 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:

Construa um controlador bรกsico em AngularJS

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.

Definir mรฉtodos em controladores AngularJS

<!-- 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:

  1. Uma funรงรฃo รฉ associada ao objeto de escopo como membro. tNameRetorna o valor atual de tutorialName.
  2. 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:

Definir mรฉtodos em controladores AngularJS

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.

Controlador AngularJS com ng-Controller

angular.module('app', [])
  .controller('HelloWorldCtrl', ['$scope', function($scope) {
    $scope.message = "Hello World";
  }]);

O cรณdigo acima faz o seguinte:

  1. Define um mรณdulo chamado โ€œappโ€ que contรฉm o controlador.
  2. Cria um controlador chamado โ€œHelloWorldCtrlโ€ que exibe a mensagem โ€œOlรก Mundoโ€.
  3. 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.

Controlador AngularJS com ng-Controller

<!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:

Controlador AngularJS com ng-Controller

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.

Perguntas Frequentes

Sim. O AngularJS cria uma instรขncia separada e um escopo separado para cada elemento que contรฉm a diretiva. As instรขncias nรฃo compartilham estado, portanto, uma alteraรงรฃo em uma nรฃo aparece na outra.

Declare-o na rota quando o controlador pertencer a uma visualizaรงรฃo completa carregada por roteamentoUse `ng-controller` para um componente que aparece dentro de uma pรกgina, independentemente da rota atual. Nunca declare ambos, ou o controlador serรก executado duas vezes.

Use a anotaรงรฃo de array, listando os nomes das dependรชncias como strings antes da funรงรฃo. Os minificadores renomeiam os argumentos da funรงรฃo, mas nunca as strings literais, entรฃo o injetor ainda resolve `$scope` e quaisquer serviรงos corretamente.

Sim. Travas deslizantes portรกteis AI Os assistentes geram as associaรงรตes de mรณdulo, controlador e escopo a partir de uma descriรงรฃo simples da tela. Sempre verifique a anotaรงรฃo de dependรชncia, pois o cรณdigo gerado frequentemente a omite.

As ferramentas de IA reescrevem as atribuiรงรตes de escopo como propriedades em uma variรกvel de mรกquina virtual capturada e adicionam o prefixo do alias a cada associaรงรฃo de visualizaรงรฃo correspondente. RevVisualize as chamadas $watch e os ouvintes de eventos manualmente, pois eles ainda exigem o objeto de escopo.

Resuma esta postagem com: