> Manuales > Manual de AngularJS

Crearemos una aplicación sencilla con la intención de practicar con controller en AngularJS, inicializando datos en el Scope, creando manejadores de eventos, etc.

Vamos a hacer un ejercicio práctico de todo lo que venimos aprendiendo con AngularJS y donde afianzar particularmente lo aprendido sobre la creación de controladores .

El ejercicio es muy sencillo en realidad. Es un "acumulador" en el que tenemos un campo de texto para escribir una cantidad y un par de botones con operaciones de sumar y restar. Luego tenemos un contador que se va incrementando con esas operaciones de sumas y restas sobre un total. En si no sirve para mucho lo que vamos a construir, lo hacemos más bien con fines didácticos.

Puedes ver el ejercicio en marcha en Codepen antes de pasar a estudiar y explicar el código con el que se ha hecho.

Código HTML

Veamos primero la parte del HTML usada para resolver este ejercicio.

<div ng-app="acumuladorApp" ng-controller="acumuladorAppCtrl as vm">
  <h1>Acumulador</h1>
  <h2>Control de operación:</h2>
  ¿Cuánto? <input type="text" ng-model="vm.cuanto" size="4" />
  <br />
  <input type="button" value="+" ng-click="vm.sumar()"/>
  <input type="button" value="-" ng-click="vm.restar()"/>
  <h2>Totales:</h2>
  En el acumulador llevamos <span>{{vm.total}}</span>
</div>

Voy describiendo los detalles más importantes que debes apreciar.

Nota: Por si no te has dado cuenta, el espacio de nombres donde tendremos al scope se ha nombrado como "vm". Ya dijimos que se puede usar cualquier nombre de varialble, eso es lo de menos, lo que queremos que se note es que "vm" son las siglas de "View Model", osea, el "modelo de la vista". Es algo que tiene que ver con el paradigma MVC en la variante en la que trabajamos con Angular. Hablaremos de eso más adelante.

Código Javascript

Ahora pasemos a la parte donde codificamos nuestro Javascript para darle vida a este ejercicio.

angular
  .module('acumuladorApp', [])
  .controller("acumuladorAppCtrl", controladorPrincipal);

function controladorPrincipal(){
  //esta función es mi controlador
  var scope = this;
  scope.total = 0;
  scope.cuanto = 0;

  scope.sumar = function(){
    scope.total += parseInt(scope.cuanto);
  }
  scope.restar = function(){
    scope.total -= parseInt(scope.cuanto);
  }
};

Vamos describiendo las principales partes del código.

Nota: También hay varias aproximaciones para definir este Javascript con los modulos y controladores de Angular. Es recomendable la creación de una envoltura para tu Javascript, por medio de una función que se autoinvoca. Esto lo veremos más adelante, puesto que no queremos complicar más el código todavía.

Con eso tenemos el ejercicio completo, todo lo demás para que esto funcione es tarea de AngularJS. De manera declarativa en el HTML hemos dicho qué son las cosas con las que se va a trabajar en la aplicación y luego hemos terminado de definir e inicializar los datos en el controlador, así como escribir en código las funcionalidades necesarias para que el ejercicio tome vida.

Variante de este mismo ejercicio pero sin "controller as"

En la resolución, que hemos comentado antes, a este ejercicio hemos usado una alternativa de la directiva de ngController en la que se le asigna un espacio de nombres al scope "acumuladorAppCtrl as vm". Esto se conoce habitualmente como "controller as" y ya comentamos en el artículo anterior dedicado a los controladores que es algo relativamente nuevo y que muchas veces la codificación que encontrarás en otros textos es un poco diferente.

Solo a modo de guía para quien está acostumbrado a trabajar de otra manera, y para que entiendas otros códigos antiguos que podrás encontrar en otras guías de Angular, pongo aquí el código de este mismo ejercicio pero sin el "controller as".

El código HTML

<div ng-app="acumuladorApp" ng-controller="acumuladorAppCtrl">
  <h1>Acumulador</h1>
  <h2>Control de operación:</h2>
  ¿Cuánto? <input type="text" ng-model="cuanto" size="4" />
  <br />
  <input type="button" value="+" ng-click="sumar()"/>
  <input type="button" value="-" ng-click="restar()"/>
  <h2>Totales:</h2>
  En el acumulador llevamos <span>{{total}}</span>
</div>

El código Javascript

var acumuladorApp = angular.module('acumuladorApp', []);
acumuladorApp.controller("acumuladorAppCtrl", ["$scope", function($scope){
  //esta función es mi controlador
  //var $scope = this;
  $scope.total = 0;
  $scope.cuanto = 0;
  
  $scope.sumar = function(){
    $scope.total += parseInt($scope.cuanto);
  }
  $scope.restar = function(){
    $scope.total -= parseInt($scope.cuanto);
  }
}]);

No comento el código más, pues es muy parecido al anterior, simplemente se deja de usar el espacio de nombres y al definir la función del controlador se inyecta el $scope de otra manera. Te dejo a ti la tarea de encontrar todas las diferencias.

Miguel Angel Alvarez

Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...

Manual