¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Angular
  3. Fundamentos de Angular
Extrait - Angular Desarrolle sus aplicaciones web con el framework JavaScript de Google
Extractos del libro
Angular Desarrolle sus aplicaciones web con el framework JavaScript de Google
2 opiniones
Volver a la página de compra del libro

Fundamentos de Angular

Introducción

En este capítulo se verán los elementos fundamentales de Angular, que permiten entender y crear una aplicación Angular sencilla.

Los componentes

Un componente se corresponde con una clase que expone una vista y definen la manera en la que el usuario interactúa con esta vista. Se trata del elemento básico de una aplicación Angular, una aplicación que ella misma es un componente.

Un componente puede estar él mismo compuesto por uno o varios componentes, por lo que una aplicación se corresponde con un ensamblado de estos elementos. La idea es que un componente debe ser independiente para ser reutilizable, sin importar los componentes que le referencian.

Para los desarrolladores AngularJS, un componente Angular sustituye a lo que se conoce con el nombre de controlador (controller). Por el contrario, la noción de scope ya no existe.

images/EI03_1.PNG

El esquema anterior ilustra el principio de componibilidad añadido por los componentes de Angular. Un componente raíz, llamado ComponenteRaiz, define la base de la aplicación. Este componente se basa en los componentes llamados ComponenteHijo1 y ComponenteHijo2. Este último componente está, él mismo, compuesto por otros componentes.

Como se ha dicho anteriormente, un componente Angular se corresponde con una clase TypeScript. Esta clase puede declarar propiedades y métodos que se expondrán como modelo del componente y por lo tanto, serán accesibles desde la vista.

export class TodolistComponent {  
} 

La clase TypeScript anterior representa un componente....

Los templates

Un template es el código HTML que representa una vista. Esta vista describe a Angular cómo se debe renderizar el componente al que está asociado.

La asociación entre un componente y un template, se hace con las propiedades template o templateUrl del decorador @Component. Permiten respectivamente declarar un template directamente en el atributo o definir una URL hacia un archivo correspondiente al template.

import { Component } from '@angular/core';  
  
@Component({  
 selector: ‘app-todolist',  
 template: ‘<h1>Mi Todo List</h1>'  
});  
export class TodolistComponent {  
   [...]  
} 

Aquí el template se define directamente dentro del decorador @Component

Si el template es demasiado grande, es mejor externalizarlo en un archivo separado. En este caso, es preferible externalizar este template en un archivo separado y referenciarlo con la propiedad templateUrl.

import { Component } from '@angular/core';  
  
@Component({  
 selector: ‘app-todolist',  
 templateUrl: './todo-list.component.html',  
});  
export class TodoListComponent {  
   [...]  
} 

Aquí el template se define con la propiedad templateUrl.

<h1>Mi Todo List</h1> 

El código anterior se corresponde con el archivo todo-list.component.html.

1. Binding

La noción de binding permite crear una relación entre los datos de un componente y los valores mostrados en las vistas. Gracias a esto, no nos tenemos que preocupar de los problemas técnicos relacionados con la sincronización de los datos entre la vista y el controlador.

La declaración de un binding se hace en la vista, con una sintaxis Angular {{xx}}.

import { Component } from '@angular/core';  
  
@Component({  
 selector: ‘app-todolist',  
 template: ‘<h1>{{listName}}</h1>'  
});  
export class TodolistComponent {  
    listName = 'Mi Todo List';  
} 

El componente anterior declara...

Los decoradores

Los decoradores Angular permiten indicar al framework cómo interpretar un elemento.

Por ejemplo, el decorador @Component se ha utilizado a lo largo de este capítulo para indicar que la clase asociada se debe interpretar como un componente.

import { Component } from '@angular/core';  
  
@Component({  
 selector: ‘app-todolist',  
 template: ‘<h1>Mi Todo List</h1>'  
});  
export class TodolistComponent {  
   [...]  
} 

Sin el decorador @Component, la clase se hubiera considerado como una clase TypeScript simple, sin enlace con ningún componente.

La gran ventaja de los decoradores es separar la parte del negocio, de la información técnica.

Hay muchos otros decoradores que se verán a lo largo del libro, como por ejemplo @Input, @Inject, @Injectable, @ViewChild.

Los pipes

En una aplicación Angular no es raro realizar una transformación en un elemento, antes de visualizarlo. El ejemplo más sencillo es el de una fecha. Cuando se muestra una fecha, raramente está en el formato tradicional JavaScript. En efecto, una fecha JavaScript se muestra en el formato siguiente: Sun Jul 10 2016 17:03:07 GMT+0200 (Paris, Madrid (hora de verano)), mientras que un usuario estará normalmente acostumbrado a leerla en un formato más accesible, como 10/06/2017. El pipe es el elemento que va a permitir gestionar estas transformaciones.

Para los desarrolladores AngularJS, los pipes Angular se corresponden con los filtros AngularJS.

1. Utilizar un pipe

Un pipe se utiliza directamente en el template de un componente. Es suficiente con aplicar el operador pipe (|) entre el valor a transformar y el pipe que queremos utilizar.

En el ejemplo siguiente, se utiliza el pipe date (un pipe proporcionado por Angular), con el objetivo de hacer más legible la fecha actual.

import { Component } from '@angular/core';  
  
@Component({  
  selector: 'today',  
  template: `<p>Estamos en el {{today | date}}</p>`  
})  
export class TodayComponent {  
  today = new Date();  
} 

Sin embargo, en este ejemplo, el template generado se parecerá a este: Estamos en el Jul 10, 2016. En efecto, Angular va a utilizar por defecto el formato de fecha americano. Para especificar el formato que se debe aplicar a la fecha, hay que pasarle argumentos al pipe.

Los argumentos se sitúan directamente detrás del nombre del pipe, separados por dos puntos (:). Para modificar el formato de visualización de la fecha, hay que pasar como argumento el formato que se debe aplicar:

<p>Estamos en el {{today | date:"MM/dd/yyyy"}}</p> 

Con este template, el componente devolverá: Estamos en el 07/10/2016.

En general, queremos poder definir un locale (variable que define la localización), para las fechas. El pipe date se ubica dentro de las capacidades de internacionalización de Angular y es posible definir el locale por defecto, a nivel de módulo. Esto se hace usando la función registerLocaleData y pasándole como argumento el locale que queremos. A continuación...

Los módulos

Un módulo permite organizar una aplicación en bloques funcionales o técnicos. También es el punto de entrada de una aplicación Angular.

De la misma manera que sucede con un componente, un módulo se declara con una clase TypeScript y se debe decorar por el atributo @NgModule:

@NgModule({  
  imports: [BrowserModule],  
  declarations: [AppComponent],  
  bootstrap: [AppComponent],  
})  
export class AppModule { } 

Este atributo tiene principalmente las siguientes propiedades:

  • imports: permite importar módulos, con el objetivo de poder utilizar todos los elementos de estos módulos en el módulo actual.

  • declarations: define todos los elementos incorporados en el módulo (componentes, directivas, pipes, etc.).

  • bootstrap: define el componente raíz de la aplicación.

  • providers: define los elementos (servicios por ejemplo), que se inyectarán en todos los componentes del módulo.

Si utiliza el CLI de Angular, el archivo del módulo se actualizará automáticamente cuando cree los componentes, filtros, etc.

Un ejemplo de módulo que normalmente nos encontramos se corresponde con el módulo de enrutamiento. Permite aislar el módulo aplicativo que contiene todo el funcionamiento de negocio, de la declaración de las rutas que contaminarían...

Observable y promesa

JavaScript es un lenguaje por naturaleza fuertemente asíncrono. Históricamente, la asincronía se ha gestionado con el mecanismo de callback.

myAsynchronousMethod(function(data) {  
    console.log(data)  
}); 

El método anterior es asíncrono. El callback pasado como argumento se ejecuta cuando la llamada asíncrona termina.

Los callbacks, aunque funcionan, presentan muchas limitaciones: gestión de errores, encadenamiento de llamadas asíncronas, etc.

Para esto, ES6 (EcmaScript 6) ofrece una especificación: las Promises. Una promise es una promesa que permite ejecutar código solo cuando la acción asíncrona termina.

Las promises tienen tres estados: pending cuando la acción asíncrona se está ejecutando, fulfilled cuando la acción se ha realizado con éxito y rejected cuando la acción ha generado un error.

myAsynchronousMethod.then(function(data) {  
    console.log(data);  
}, function(error) {  
    console.error(error);  
}); 

El método anterior es asíncrono y expone una promesa. Los parámetros pasados como argumentos se corresponden con el callback de éxito y de error. 

Angular también utiliza la noción de observable, introducida por la librería RxJS. A diferencia...

Preparar la aplicación para un entorno de producción

Por defecto, Angular se ejecuta en modo de desarrollo. Este modo de desarrollo se hace para que Angular exponga información sobre el estado de la aplicación y realice un número de comprobaciones adicionales con el objetivo de ayudar al equipo de desarrollo.

Por ejemplo, una de estas comprobaciones es realizar dos ciclos de ejecuciones en lugar de uno solo. Esto permite asegurarse de que los valores bindeados no han cambiado entre estos dos ciclos, con el objetivo de detectar efectos secundarios que pueden causar errores.

En el lado negativo del modo de desarrollo está el impacto sobre el rendimiento. Obviamente, estas comprobaciones adicionales llevan su tiempo y no son necesarias cuando la aplicación se despliega en producción.

La activación del modo producción se hace llamando al método enableProdMode

Import { enableProdMode } from '@angular/core';  
  
enableProdMode(); 

Es necesario realizar la importación del método enableProdMode desde @angular/core antes de poder llamarlo.

Este método se debe llamar antes del bootstrap de la aplicación.

Import { enableProdMode } from '@angular/core';  
  
enableProdMode();  
bootstrap(...);