Controladores AngularJS con ejemplo de ng-Controller
⚡ Resumen inteligente
Un controlador en AngularJS contiene la lógica de negocio de una pantalla. Recibe datos a través del objeto scope, los procesa y expone el resultado de vuelta a la vista, manteniendoping Marcado de presentación libre de lógica de aplicación.
¿Qué es el controlador en AngularJS?
A Control En AngularJS, el controlador toma los datos de la vista, los procesa y luego los envía a la vista que se muestra al usuario final. El controlador contiene la lógica de negocio principal. Utiliza el modelo de datos, realiza el procesamiento necesario y luego pasa el resultado a la vista.
⚠️ Nota de versión: AngularJS (la rama 1.x) llegó al final de su ciclo de vida el 31 de diciembre de 2021 y ya no recibe actualizaciones de seguridad. Los conceptos que se describen a continuación siguen siendo válidos para aplicaciones antiguas; en Angular moderno, esta misma función la desempeña una clase de componente en lugar de un controlador.
Saber qué es un controlador deja una pregunta abierta: ¿cómo se comunica realmente con la vista? La siguiente sección responde a esa pregunta.
¿Qué hace Controller desde la perspectiva de Angular?
A continuación se presenta una definición sencilla del funcionamiento de un controlador de AngularJS:

- La responsabilidad principal del controlador es controlar los datos que pasan a la vista. El alcance y la vista tienen comunicación bidireccional.
- Las propiedades y los eventos de la vista pueden llamar a funciones en el ámbito. El siguiente fragmento muestra la función ($ alcance) declarado con el controlador más una función interna que devuelve
$scope.firstNamey$scope.lastNamese unió. En AngularJS, una función definida como una variable es un Método.
- Los datos pasan del controlador al ámbito, y luego van y vienen entre el ámbito y la vista.
- El ámbito expone el modelo a la vista. El modelo se puede modificar mediante métodos definidos en el ámbito, que se activan mediante eventos de la vista.
- Los controladores no deben usarse para manipular el DOM. Ese es el trabajo de directivas.
- La mejor práctica es basar los controladores en la funcionalidad. Si tienes un formulario de entrada que necesita un controlador, crea uno llamado "controlador de formulario".
Una vez comprendido el mecanismo, la siguiente sección crea un controlador a partir de una página vacía.
Cómo construir un controlador básico en AngularJS
A continuación se detallan los pasos para crear un controlador en AngularJS.
Paso 1) Crea una página HTML básica
Antes de crear un controlador, la página HTML básica debe estar lista. El fragmento a continuación es una página simple titulada “Registro de eventos” que hace referencia a Bootstrap y AngularJS.
- Referencias a la Bootstrap Hoja de estilo CSS, utilizada junto con la Bootstrap biblioteca.
- Una referencia a la biblioteca AngularJS. Todo lo que se haga con AngularJS a partir de ahora se resolverá desde este archivo.
- Una referencia a la Bootstrap biblioteca, que hace que ciertos controles sean receptivos.
⚠️ Corrección: El original cargó jQuery y afirmó que AngularJS depende de él. No es así. AngularJS viene con jqLite, un subconjunto integrado de la API de jQuery, y solo se actualiza a jQuery completo si jQuery se carga. antes Se ha eliminado la referencia.
Paso 2) Verifique los archivos y la estructura de los archivos
- Los archivos se dividen en dos carpetas como en cualquier aplicación web convencional: "css" para hojas de estilo y "lib" para JavaScript archivos.
- El archivo bootstrap.css se encuentra en la carpeta css y le da al sitio su apariencia.
- angular.js es la biblioteca principal, descargada del sitio de AngularJS y almacenada en lib.
- El archivo app.js contendrá el código de los controladores.
Paso 3) Utilice el código AngularJS para mostrar el resultado
El objetivo es mostrar las palabras "AngularJS" tanto en texto plano como dentro de un cuadro de texto cuando se abre la página en el 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 Explicación:
- aplicación ng marca este elemento como la raíz de una aplicación AngularJS. Atributos con prefijo ng- son directivas integradas. “DemoApp” es el nombre que se le da a la aplicación.
- El div lleva controlador ng con el nombre “DemoController”, lo que otorga a ese elemento y a todo lo que contiene acceso al ámbito del controlador.
- modelo ng crea la vinculación del modelo, conectando el cuadro de texto Nombre del tutorial a la propiedad del ámbito
tutorialName. - El módulo
DemoAppse crea y el controlador asigna un valor predeterminado de “AngularJS” atutorialName.
⚠️ Correcciones aplicadas. El listado original declaraba chrset="UTF 8", que no es ni un atributo válido ni un nombre de codificación válido, y cargó AngularJS dos veces: una vez desde la CDN y otra vez desde lib/angular.jsCargar la biblioteca dos veces vuelve a registrar el sistema de módulos y produce un comportamiento impredecible. La anotación de matriz de dependencias ['$scope', function($scope){…}] También se agregó, sin lo cual el controlador falla en el momento en que se minimiza el archivo.
Salida:
Gracias tutorialName Se le asignó el valor “AngularJS”, el cual aparece en el cuadro de texto y en la línea de texto sin formato. Una sola propiedad es suficiente para una demostración; los controladores reales suelen exponer también el comportamiento, tema que se aborda en la siguiente sección.
Cómo definir métodos en controladores AngularJS
Normalmente, se definirían varios métodos en un controlador para separar la lógica de negocio. Si el controlador tuviera que sumar dos números y restar...tracSi hay dos números, se crearía un método para cada operación.
El siguiente ejemplo define un método personalizado dentro de un controlador de AngularJS que devuelve una cadena de texto.
<!-- 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 Explicación:
- Una función se adjunta al objeto de ámbito como miembro.
tName. Devuelve el valor actual detutorialName. - La vista llama al método con
{{tName()}}Los paréntesis son importantes: sin ellos, la expresión imprime la función en sí misma en lugar de su resultado.
⚠️ Corrección: El método original lee $scope.tName = function() { return $scope.tName; };. Esa función devuelve sí misma, no el nombre del tutorial, por lo que la página renderizó el cuerpo de la función en lugar de texto. Ahora devuelve $scope.tutorialName.
Salida:
Hasta ahora, todo se ha almacenado en un solo archivo. Las aplicaciones de producción mantienen los controladores separados, como se muestra en la siguiente sección.
Ejemplo de controlador AngularJS con ng-Controller
El ejemplo “HelloWorld” anterior colocó toda la funcionalidad en un solo archivo. Ahora es el momento de mover el código del controlador a su propio archivo.
Paso 1) En el archivo app.js, agregue el siguiente código para su controlador.
angular.module('app', []) .controller('HelloWorldCtrl', ['$scope', function($scope) { $scope.message = "Hello World"; }]);
El código anterior hace lo siguiente:
- Define un módulo llamado “app” que contiene el controlador.
- Crea un controlador llamado “HelloWorldCtrl” que muestra un mensaje de “Hola Mundo”.
- Utiliza el objeto scope para pasar información del controlador a la vista, en este caso una variable llamada
message.
Paso 2) En Sample.html, agregue un div que contenga la directiva ng-controller y una referencia a la variable miembro. messageRecuerda hacer referencia a app.js, que contiene el código fuente del 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>
⚠️ Corrección: Se debe cargar el archivo app.js. después angular.js, ya que llama angular.module. El original también cargó la biblioteca dos veces y llevó el mismo chrset error de tipografía.
Salida:
Todos los ejemplos hasta ahora han leído y escrito propiedades directamente en $scopeLa sección siguiente describe la alternativa que recomienda el equipo de AngularJS.
Cómo usar la sintaxis controllerAs en AngularJS
Vinculación directa con $scope funciona, pero se vuelve ambiguo tan pronto como los controladores se anidan. Una expresión de vista como {{name}} no da ninguna pista de qué controlador es el propietario namey debido a que los ámbitos secundarios heredan prototípicamente de los ámbitos principales, un controlador anidado que escribe en una primitiva heredada crea silenciosamente su propia copia en la sombra. controllerAs La sintaxis elimina ambos problemas al asignar un alias a cada controlador.
Paso 1) Alias el controlador en la vista usando el as palabra clave, luego anteponga ese alias a cada enlace.
Paso 2) Dentro del controlador, adjunte propiedades a this en lugar 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>
Se obtienen tres ventajas. Los enlaces se vuelven autodocumentados, porque demo.tutorialName nombra a su propietario. Los controladores anidados dejan de colisionar, ya que un padre tiene un alias. outer y un niño alias inner ambos pueden exponer nameLos valores también se vinculan a través de un objeto en lugar de un tipo primitivo simple, lo que permite evitar problemas.ping La trampa en la que una edición en un elemento hijo nunca llega al elemento padre.
👍 Tip: Capturar this en una variable como vm en la parte superior del controlador. Dentro de una función de devolución de llamada, this Se refiere a algo completamente distinto, y la referencia capturada mantiene la vinculación correcta.
Elegir un estilo de enlace es una decisión. Decidir qué debe incluirse en un controlador es otra, y la comparación que aparece a continuación traza esa línea.
Controlador vs. Servicio en AngularJS
Los principiantes suelen sobrecargar el controlador con tareas que deberían estar en un servicio. La diferencia radica en el ciclo de vida y la reutilización: un controlador existe solo mientras su vista está en pantalla, mientras que un servicio es un singleton que existe durante toda la vida útil de la aplicación.
| Aspecto | Control | Servicio |
|---|---|---|
| Dura toda la vida | Creado y destruido con la vista | Una única instancia para toda la aplicación. |
| Propósito | Prepare los datos para una vista | Lógica compartida, estado y llamadas al servidor |
| Reutilizable | No, vinculado a su visión | Sí, inyectable en cualquier parte. |
| Mantiene el estado entre vistas | No, el estado se pierde en la navegación. | Sí, el estado persiste. |
| Contenido típico | Propiedades del ámbito y métodos de vista | Llamadas HTTP, almacenamiento en caché, reglas de negocio |
Mantén los controladores sencillos. Si dos controladores necesitan la misma lógica, o si un valor debe conservarse al navegar entre vistas, trasládalo a un servicio e inyéctalo donde sea necesario. Una prueba práctica consiste en preguntarse si el código seguiría teniendo sentido con la pantalla actual cerrada. Si la respuesta es afirmativa, entonces debería estar en un servicio.











