Escolar Documentos
Profissional Documentos
Cultura Documentos
Cochabamba – Bolivia
2
Agradecimientos:
TABLA DE CONTENIDO
Resumen.......................................................................................................................................... 8
Introducción .................................................................................................................................. 10
1. Generalidades..................................................................................................................... 12
2. Metodología ....................................................................................................................... 14
3. Subtemas ............................................................................................................................ 14
3.1.1 Módulos............................................................................................................... 16
3.1.5 Enrutamiento........................................................................................................... 19
3.3.2 Almacén................................................................................................................... 27
3.6.1 Instalación............................................................................................................... 42
Conclusiones ................................................................................................................................. 50
Bibliografía ................................................................................................................................... 52
7
RESUMEN
Los datos de las aplicaciones web fluyen en una sola dirección, permitiendo tener mayor control
y haciendo fácil la corrección y detección de errores; sin embargo, uno de los principales
eventos que afectan a múltiples vistas generando efectos en cascada, haciendo muy difícil
Una aplicación a gran escala, tiende a que la gestión del estado de la aplicación pueda
convertirse en un problema a medida que esta crece. El estado de la aplicación incluye respuestas
del servidor, datos en caché y datos que aún no se han conservado en el servidor.
Redux predice las mutaciones de estado, sin perder las ventajas de rendimiento Asíncrono, lo
hace imponiendo ciertas restricciones sobre cómo pueden ocurrir las actualizaciones, estas
● Acciones: son objetos planos de Java, con al menos una propiedad que indica el tipo de
acción.
● Reductores: es una función que recibe el estado actual y devuelve un nuevo estado.
● Almacenes: reciben acciones para pasarlas por los middlewares, para luego pasarlas por
Igualmente, Redux se basa en tres principios fundamentales: única fuente de verdad, el estado es
Aplicando Redux para el desarrollo de una aplicación, permitirá que la misma pueda ser
escalable.
10
INTRODUCCIÓN
En un principio la web estaba compuesta por páginas estáticas y documentos; entre otros, que el
usuario utilizaba para consulta y descarga, sin embargo, conforme al mayor uso del internet el
uso de la web tuvo que ir transformándose a las necesidades de un número creciente de usuarios;
de esta forma el siguiente paso fue la creación de páginas dinámicas que pudieran mostrar
En el año 1998, Netscape Navigator anuncia la nueva tecnología JavaScript, la cual permite que
el contenido de una página web cambie de forma dinámica, si bien se aceptaban scripts en
Netscape desde 1997, JavaScript vino a revolucionar el uso de las aplicaciones web1.
A finales de la década de los 90, las aplicaciones web fueron creciendo exponencialmente, sobre
todo para usos empresariales, por lo que las aplicaciones web de hoy en día son mucho más
grandes, lo cual implica un incremento de la complejidad. Esa complejidad hace que tareas como
la comunicación entre distintos componentes de la interfaz y la gestión del estado sigan un flujo
En general los datos de una aplicación web fluyen en una sola dirección, lo cual permite tener
más control de la aplicación, haciendo fácil detectar, corregir errores y lograr llevar la aplicación
1
Ver https://www.sutori.com/story/historia-de-las-aplicaciones-web .
11
Sin embargo, uno de los principales problemas, es el flujo de datos bidireccional, donde un
cambio en la interfaz dispara múltiples eventos que afectan a múltiples vistas generando efectos
Por ejemplo, el problema se presenta cuando una aplicación web se vuelve muy grande y la
complejidad del mismo puede volverse exponencial cada vez que se intenta adicionar una nueva
Una solución a este problema es el uso del patrón Redux, que ayuda a la gestión del estado de la
aplicación y estado de cada uno de los componentes. Al hacer uso de este concepto, se deja el
control del estado en un único objeto llamado almacén, que es a su vez el único capaz de
modificarlo.
12
1. Generalidades
Flux es una arquitectura diseñada por Facebook junto con una librería para vistas. Se enfoca en
crear flujos de datos explícitos y entendibles, lo cual hace más sencillo seguir los cambios en el
estado de la aplicación y por ende los errores más fáciles de encontrar y corregir.
responsable de coordinar los cambios en uno o más modelos, lo hace mediante llamadas a
métodos en los modelos. Cuando los modelos cambian, se notifican las vistas, las cuales a su vez
leen los nuevos datos del modelo y se actualizan de acuerdo a esos cambios para que el usuario
Conforme la aplicación crece y se agregan más controladores, modelos y vistas las dependencias
Cuando el usuario interactúa con la interfaz gráfica, múltiples ramas de código son ejecutadas y
encontrar errores o correr pruebas sobre el estado de la aplicación, se vuelve una tarea muy
difícil, en la que básicamente se tiene que tratar de adivinar en cuál de todos los puntos se
encuentra el error. En los peores casos, una interacción causa actualizaciones adicionales en
Flux evita este diseño en favor de un flujo de datos en una sola dirección. Todas las interacciones
dentro de una vista llaman un “creador de acciones” que a su vez llama al “despachador” de tipo
Singleton, que es responsable de emitir un evento de tipo “acción” al cual los “almacenes” se
Flux evita este diseño en favor de un flujo de datos en una sola dirección. Todas las
interacciones dentro de una vista llaman un “creador de acciones” que a su vez llama el
“despachador” de tipo Singleton que es responsable de emitir un evento de tipo “acción” al cual
actualizan.
una forma predecible. Está creado para disminuir el número de relaciones entre los componentes
patrón transversal que se adapta a cualquier tipo de librería o framework del lado del cliente.
Con tan solo 2 KB, Redux es una librería muy liviana y se puede ejecutar a la perfección por el
motor de JavaScript. Para tener una idea de su repercusión, empresas como Netflix lo han
2. Metodología
experiencias observadas.
3. Subtemas
Los módulos permiten organizar funcionalidad de los subsistemas, dentro de los cuales existen
la interfaz, los cuales tienen plantillas asociadas que ayudan a separar la lógica del negocio de
vista de la presentación del DOM, estos componentes interactúan con lógica del negocio
mediante servicios que se encargan de realizar dicha interacción, son las principales
características de Angular.
15
como un conjunto de bibliotecas de TypeScript que importa a sus aplicaciones. (Angular, 2018)
Los bloques de construcción básicos de una aplicación angular son NgModules, que
relacionado en conjuntos funcionales; una aplicación angular está definida por un conjunto de
NgModules. Una aplicación siempre tiene al menos un módulo raíz que habilita el arranque, y
Los componentes definen vistas, que son conjuntos de elementos de pantalla que Angular puede
Los componentes usan servicios que proporcionan una funcionalidad específica, que no está
directamente relacionada con las vistas. Los proveedores de servicios pueden inyectarse en
componentes como dependencias, haciendo que su código sea modular, reutilizable y eficiente.
Tanto los componentes, como los servicios son simplemente clases, con decoradores que marcan
Los metadatos de una clase de componente lo asocian con una plantilla que define una vista. Una
plantilla combina HTML común con directivas angulares y marcado de enlace que permiten a
Los metadatos de una clase de servicio proporcionan la información que Angular necesita para
en el navegador.
3.1.1 Módulos
relacionadas. Un NgModule puede asociar sus componentes con código relacionado, como
Cada aplicación angular tiene un módulo raíz, denominado de manera convencional AppModule,
que proporciona el mecanismo de arranque que inicia la aplicación. Una aplicación generalmente
Al igual que los módulos de JavaScript, NgModules puede importar funcionalidades de otros
aprovechar la carga diferida, es decir, cargar módulos bajo demanda, para minimizar la cantidad
3.1.2 Componentes
Cada aplicación angular tiene al menos un componente, el componente raíz que conecta una
jerarquía de componentes con el modelo de objetos del documento de página (DOM) (Angular,
2018).
Cada componente define una clase que contiene datos y lógica de la aplicación, y está asociada a
una plantilla HTML que define una vista que se mostrará en un entorno objetivo.
relacionados.
Una plantilla combina HTML con marcado angular que puede modificar elementos HTML antes
vinculante conecta los datos de su aplicación y el DOM. (Angular, 2018) Hay dos tipos de enlace
de datos:
● El enlace de eventos, que permite que su aplicación responda a la entrada del usuario en
● El enlace de propiedad, que permite interpolar valores que se computan a partir de los
Antes de que se muestre una vista, Angular evalúa las directivas y resuelve la sintaxis de enlace
en la plantilla para modificar los elementos HTML y el DOM, según los datos y la lógica de su
programa. Angular admite el enlace de datos bidireccional, lo que significa que los cambios en el
DOM, como las opciones del usuario, también se reflejan en los datos de su programa.
Sus plantillas pueden usar tuberías para mejorar la experiencia del usuario al transformar los
valores para su visualización. Por ejemplo, el uso de tuberías para mostrar fechas y valores de
moneda que sean apropiados para la configuración regional de un usuario. Angular proporciona
tuberías predefinidas para transformaciones comunes, y también puede definir sus propias
tuberías.
Para los datos o la lógica que no está asociada a una vista específica y que se desea compartir
entre los componentes, crea una clase de servicio. Una definición de clase de servicio va
El decorador proporciona los metadatos que permiten que su servicio se inyecte en los
eficientes. No obtienen datos del servidor, validan la entrada del usuario o inician sesión
3.1.5 Enrutamiento
una ruta de navegación entre los diferentes estados de aplicación y ver jerarquías en su
correspondiente.
● Hacer clic en los enlaces en la página y el navegador navega a una nueva página.
● Hacer clic en los botones para retroceder y avanzar del navegador y el navegador navega
hacia atrás y hacia adelante por el historial de las páginas que se visitó.
El enrutador mapea rutas de tipo URL a vistas en lugar de páginas, cuando un usuario realiza una
acción, como hacer clic en un enlace, que cargaría una página nueva en el navegador, el
enrutador intercepta el comportamiento del navegador y muestra u oculta las jerarquías de vista.
particular, y que el módulo que lo define no se ha cargado, el enrutador puede cargar el módulo a
demanda.
20
El enrutador interpreta una URL de enlace según las reglas de navegación de la vista de su
aplicación y el estado de los datos. Se puede navegar a nuevas vistas cuando el usuario hace clic
cualquier fuente. El enrutador registra la actividad en el historial del navegador, por lo que los
Para definir las reglas de navegación, se procede a asociar las rutas de navegación con sus
componentes. Una ruta utiliza una sintaxis similar a una URL que integra los datos de su
programa, de forma muy parecida a como la sintaxis de la plantilla integra sus vistas con los
datos de su programa. A continuación, puede aplicar la lógica del programa para elegir qué vistas
mostrar u ocultar, en respuesta a la entrada del usuario y sus propias reglas de acceso.
Las mejoras que aporta el patrón MVVM se basan en la separación de las interfaces de usuario
de la lógica de negocio y sus principales componentes son: modelo vista vista modelo.
Modelo Vista Vista Modelo MVVM, es un patrón arquitectónico basado en MVC y MVP, que
intenta separar más claramente el desarrollo de las interfaces de usuario (UI) de la lógica de
este fin, muchas implementaciones de este patrón hacen uso de enlaces de datos declarativos
para permitir una separación del trabajo en Vistas desde otras capas. Esto facilita la interfaz de
usuario y el trabajo de desarrollo que ocurre casi simultáneamente dentro de la misma base de
21
MVVM fue originalmente definido por Microsoft para su uso con Windows Presentation
Foundation (WPF) y Silverlight, habiendo sido anunciado oficialmente en 2005 por John
Grossman en una publicación de blog sobre Avalon (el nombre clave de WPF). También
encontró cierta popularidad en la comunidad de Adobe Flex como alternativa al simple uso de
MVC. Antes de que Microsoft adoptara el nombre de MVVM, sin embargo, hubo un
movimiento en la comunidad para pasar de MVP a MVPM: Modelo Vista Presentación Modelo.
(Microsoft, 2018)
como KnockoutJS, Kendo MVVM y Knockback.js, con una respuesta positiva general de la
comunidad.
22
3.2.1 Modelo
información o datos específicos del dominio con los que nuestra aplicación estará trabajando. Un
ejemplo típico de datos específicos del dominio puede ser una cuenta de usuario (por ejemplo,
nombre, avatar, correo electrónico) o una pista de música (por ejemplo, título, año, álbum).
su responsabilidad. En cambio, el formato de los datos es manejado por la Vista, mientras que el
comportamiento de la lógica de negocio debe ser encapsulada en otra capa que interactúa con el
Modelo: Vista Modelo. La única excepción a esta regla tiende a ser la validación y se considera
aceptable que los Modelos validen los datos que se utilizan para definir o actualizar modelos
3.2.2 Vista
Al igual que con MVC, la Vista es la única parte de la aplicación con la que los usuarios
realmente interactúan. Son una interfaz de usuario interactiva que representa el estado de un
Vista Modelo. En este sentido, la vista se considera activa en lugar de pasiva, pero esto también
En MVC, MVP y MVVM una vista también puede ser pasiva. Una vista pasiva solo muestra una
pantalla y no acepta ninguna entrada del usuario, dicha vista también puede no tener un
conocimiento real de los modelos en nuestra aplicación y podría ser manipulada por un
que requieren una comprensión del Vista Modelo. Aunque estos comportamientos se pueden
asignar a las propiedades, la Vista sigue siendo responsable de manejar los eventos desde el
Es importante recordar que la Vista no es responsable por el manejo del estado; lo mantiene
Vista Modelo, puede considerarse un Controlador especializado que actúa como un convertidor
Vista al Modelo. Por ejemplo, imaginemos que tenemos un modelo que contiene un atributo de
fecha en formato Unix (por ejemplo, 1333832407), en lugar de que nuestros modelos conozcan
la fecha de visualización del usuario (p. Ej., 04/07/2012 a las 5:00 p.m.), donde sería necesario
formato sin formato de los datos, nuestra vista contiene la fecha formateada y nuestro modelo de
En este sentido, Vista Modelo podría considerarse más un Modelo que una Vista, pero maneja la
mayor parte de la lógica de visualización de la Vista. Vista Modelo también puede exponer
métodos para ayudar a mantener el estado de la Vista, actualizar el modelo basado en la acción
En resumen, Vista Modelo se encuentra detrás de nuestra capa de interfaz de usuario, expone los
datos que necesita una Vista (de un Modelo) y se puede ver como la fuente a la que van nuestras
Nuestras Vistas manejan sus propios eventos de interfaz de usuario, asignándolos a la Vista
Modelo según sea necesario, los modelos y atributos en la Vista Modelo se sincronizan y
actualizan a través de enlace de datos bidireccional. Vista Modelo no solo expone los atributos
25
del Modelo, sino también el acceso a otros métodos y funciones, como la validación. Los
disparadores (desencadenadores de datos) también nos permiten reaccionar aún más a los
cambios en el estado de nuestros atributos de modelo; si bien puede parecer que Vista Modelo es
completamente responsable del Modelo en MVVM, hay algunas sutilezas con esta relación que
vale la pena mencionar. Vista Modelo puede exponer los atributos de un Modelo o Modelos a
efectos de enlace de datos y también puede contener interfaces para recuperar y manipular
3.3 Flux
Flux, es la arquitectura de aplicaciones que se usa para construir aplicaciones web del lado del
cliente. Utilizando un flujo de datos unidireccional. Los datos de una aplicación con la
arquitectura flux, fluyen en una sola dirección, lo cual nos permite tener más control de nuestra
aplicación haciendo fácil detectar y corregir errores, el concepto fue creado para mejorar los
puntos débiles y la dificultad de controlar los cambios en la capa de presentación del patrón
MVC (o MVVM).
El patrón MVC para la capa de presentación, empezó a ser necesario cuando las aplicaciones
web empezaron a hacerse más grandes y con librerías como jQuery o el propio Vanilla
JavaScript se hacían difíciles de manejar. Por eso nacieron frameworks como Backbone, Ember
Todos ellos siguen una arquitectura Modelo-Vista-Controlador, o algo parecido (MVVM, MV*).
Haciendo más sencillo el manejo de datos en aplicaciones web con cierto grado de complejidad.
26
Flux nació desde Facebook por un problema que se les presentaba al tener una comunicación
bidireccional entre los modelos y los controladores, haciéndoles muy difícil poder depurar y
rastrear errores.
Flux propone una arquitectura en la que el flujo de datos es unidireccional, descrito en la Figura
2. Los datos viajan desde la vista por medio de acciones y llegan a un Store desde el cual se
Flux es un patrón de diseño o forma de "arquitecturar" una aplicación web, en concreto la forma
en la que se manejan los datos o estado de la aplicación (datos de un usuario, datos recogidos a
27
partir de un API REST o WebService, etc.), no se trata de una librería ni framework. (Bugl,
2017, p. 57).
Al igual que un patrón MVC está formado por un Modelo, una Vista y un Controlador, en Flux
3.3.1 Vista
La vista serían los componentes web, ya sean construidos nativamente, con Polymer, Angular,
React.
3.3.2 Almacén
No hay métodos en el almacén que permitan modificar los datos en ella, eso se hace a través de
despachadores y acciones.
3.3.3 Acciones
Una acción es simplemente un objeto JavaScript que indica una intención de realizar algo y que
Por ejemplo, si tenemos una aplicación tipo carrito de la compra, y añadimos un ítem al carrito,
{
28
type: 'ADD_ITEM',
item: item
3.3.4 Despachador
Las acciones como la anterior son enviadas a un despachador que se encarga de dispararla o
propagarla hasta el almacén. La vista es la que se encarga de enviar las acciones al despachador.
Un despachador no es más que un mediador entre el almacén o almacenes y las acciones. Sirve
para desacoplar la Store de la vista, ya que así no es necesario conocer que Store maneja una
● La vista, mediante un evento envía una acción con la intención de realizar un cambio en
el estado
● La acción contiene el tipo y los datos (si los hubiere) y es enviada al despachador.
● El almacén recibe la acción y dependiendo del tipo recibido, actualiza el estado y notifica
ya no están actualizadas y poco a poco una de ellas se fue posicionando como referencia.
● Reflux
● McFly
● Marty.js
● Delorean
● Fluxxor
● Lux.js
● Fluxible
● Omniscent
● Redux
3.4 Redux
Redux, es una librería que implementa el patrón de diseño Flux, que se encarga de emitir
la modificación se maneja a través de objetos sencillos llamados acciones. Luego se escribe una
función especial llamada reductor para decidir cómo cada acción transforma el estado de toda la
aplicación.
30
Una aplicación a gran escala, tiende a que la gestión del estado de la aplicación pueda
convertirse en un problema a medida que esta crece. El estado de la aplicación incluye respuestas
del servidor, datos en caché y datos que aún no se han conservado en el servidor. (Redux, 2018)
El enrutamiento del lado del cliente es bueno para el rendimiento, pero significa que el cliente
debe tratar con más estados (en comparación con el uso del enrutamiento del lado del servidor).
Los conflictos e inconsistencias en estos diversos tipos de estado pueden ser difícil de tratar.
Como si todo esto no fuera lo suficientemente malo, nuevos requisitos, como actualizaciones
optimistas y la representación del lado del servidor, se vuelven necesarios, para poder
Este estado es difícil de tratar, porque se mezcla dos conceptos que pueden ser muy
forma asincrónica. Por ejemplo, un usuario presiona un botón que causa una solicitud del
31
una respuesta cada vez que ocurre, pero es impredecible cuando esto sucederá. (Bugl,
2017, p. 40)
nueva página con el cliente, el enrutamiento, cambiaría el valor de la ruta actual, mutando
Redux intenta predecir las mutaciones de estado, sin perder las ventajas de rendimiento de
Asincronicidad, lo hace imponiendo ciertas restricciones sobre cómo pueden ocurrir las
2018).
Una vez que un componente necesita compartir el estado con otro componente, con el que no
tiene una relación padre-hijo, las cosas comienzan a complicarse. En la Figura 3, se puede
visualizar ese problema. Una vez que un componente inicia un cambio de estado, este cambio
debe propagarse a todos los demás componentes que dependen de los datos modificados.
32
El siguiente grafico muestra los principales elementos de la arquitectura Redux, que ayudan a la
3.4.1.1Acciones (Actions)
Las Acciones son POJOs (Plain Old JavaScript Objects) con al menos una propiedad que indica
el tipo de acción y de ser necesario, otras propiedades indicando cualquier otro dato necesario
para efectuar la acción. Ver Figura 5. Normalmente se usa el formato definido en el Flux
Estas son simplemente funciones que pueden o no recibir parámetros y devuelven una acción (un
POJO), es muy buena idea, para evitar problemas de consistencia, programar una función por
cada tipo de acción y usarlas en vez de armar nuestros objetos a mano. Ver Figura 6. (Dinkevich,
2017, p. 504).
Debido a que normalmente son funciones puras son fáciles de testear. Luego de ejecutar nuestra
3.4.1.3Reductores (Reducers)
Un reductor es una función pura que recibe el estado actual y una acción y devuelve el nuevo
Es muy importante que se mantengan como funciones puras. Algunas cosas que no se debería
● Realizar acciones con efectos secundarios como llamadas a una API o cambiar rutas
Que se mantengan puros, quiere decir que pasándole los mismos parámetros debería siempre
3.4.1.4Almacenes (Store)
A diferencia de muchas otras implementaciones de Flux, Redux tiene un único almacén que
contiene la aplicación información, pero sin lógica de usuario. El papel del almacén es recibir
acciones, pasarlas a través de todos los middlewares registrados, y luego usar reductores para
calcular un nuevo estado y guardarlo. Cuando recibe una acción que causa un cambio en el
estado, el almacén tienda notificará a todos los oyentes registrados, que se ha hecho un cambio al
estado. Esto permitirá varias partes del sistema, como la interfaz de usuario, para actualizarse de
Esto hace fácil crear aplicaciones universales, ya que el estado en el servidor puede ser
serializado y enviado al cliente sin ningún esfuerzo extra. Como un único árbol de estado
también hace más fácil depurar una aplicación; igualmente permite mantener el estado de la
aplicación en desarrollo, para un ciclo de desarrollo más veloz. Algunas funcionalidades que
La única forma de modificar el estado es emitiendo una acción, un objeto describiendo que
ocurrió.
38
Esto te asegura que ni tu vista ni callbacks de red van a modificar el estado directamente, como
En vez de eso, expresan un intento de modificar el estado, ya que todas las modificaciones están
centralizadas y suceden en un orden estricto, no hay que preocuparse por una carrera entre las
acciones. y como las acciones son objetos planos, pueden ser registrados, serializados y
Para especificar como el árbol de estado es transformado por las acciones, se utilizan reductores
Los reductores son funciones puras que toman el estado anterior y una acción, y devuelven un
nuevo estado, como se puede apreciar en la Figura 9. Se debe devolver un nuevo objeto de
estado en vez de modificar el anterior. Inicialmente se puede empezar con un único reductor, y
39
mientras la aplicación crece, dividir en varios reductores pequeños que manejen partes
específicas del árbol de estado. Ya que los reductores son funciones puras, se puede controlar el
orden en que se ejecutan, pasar datos adicionales, o incluso hacer reductores reusables para
funciones puras en vez de emisores de eventos, y las funciones puras son fáciles de componer y
Flux siempre fue descripto como (estado, acción) => estado. En ese sentido, Redux es una
verdadera arquitectura Flux, pero más simple gracias a las funciones puras.
Otra diferencia importante con Flux es que Redux asume que nunca se modifican los datos, se
puede usar objetos planos o arreglos para el estado y está perfecto, pero modificarlos dentro de
simple con la propuesta del operador spread, o con librerías como Inmutable.
Mientras que técnicamente es posible escribir reductores impuros que modifican los datos por
demostró que incluso se llega a perder la posibilidad de usar asignación en objetos, debido a que
sabes exactamente qué cambio gracias a los reductores puros. (Noring, 2018, p. 216)
3.5 NgRx
NgRx, es una colección de bibliotecas reactivas para angular, que contiene una implementación
de reducción y muchas otras bibliotecas útiles al ser una implementación de Redux hecha para
Angular, los conceptos como almacenes, creadores de acciones, acciones, selectores y reductores
41
son bien utilizados. Es una excelente manera de administrar el estado utilizando el patrón Redux
NgRx ayuda a crear aplicaciones más sólidas organizando mejor el estado de su aplicación, en
otras palabras, los datos de la aplicación. Sin una solución de administración del estado, tratar
con datos complejos en múltiples componentes puede ser bastante difícil de manejar y probar.
● @ ngrx / store: este es el núcleo que contiene una forma para que podamos mantener el
● @ngrx/effects, maneja los efectos secundarios como, por ejemplo, las solicitudes de
AJAX.
● @ ngrx / router-store: Asegura que podamos integrar NgRx con Angular routing.
● @ngrx/entity: esta es una biblioteca que nos ayuda a administrar las colecciones de
registros.
● @ngrx/schematics: esta es una biblioteca de andamios que lo ayuda cuando usa NgRx.
42
El presente ejemplo muestra cómo definir la creación y eliminación de usuarios, haciendo uso
Pasos:
3.6.1 Instalación
Instalar ngrx/store con el siguiente con el siguiente comando: npm install @ngrx/store.
app/customers/models/customer.ts
app/actions/customer.actions.ts
app/reducers/customer.reducer.ts
switch (action.type) {
case CREATE_CUSTOMER:
return [...state, action.payload];
case DELETE_CUSTOMER:
return state.filter(({ id }) => id !== action.id);
default:
return state;
}
}
44
app/app.state.ts
app/app.module.ts
@NgModule({
declarations: [
AppComponent,
CreateCustomerComponent,
CustomersListComponent,
CustomerDetailsComponent
],
imports: [
BrowserModule,
StoreModule.forRoot({
customer: reducer
})
],
providers: [],
bootstrap: [AppComponent]
})
45
customers/create-customer/create-customer.component.ts
@Component({
selector: 'app-create-customer',
templateUrl: './create-customer.component.html',
styleUrls: ['./create-customer.component.css']
})
export class CreateCustomerComponent implements OnInit {
ngOnInit() {
}
customers/create-customer/create-customer.component.html
<div style="max-width:300px;">
<h3>Create Customers</h3>
<div class="form-group">
<input class="form-control" type="text" placeholder="id" #id>
</div>
<div class="form-group">
<input class="form-control" type="text" placeholder="name" #name>
46
</div>
<div class="form-group">
<input class="form-control" type="number" placeholder="age" #age>
</div>
<button class="btn btn-success" (click)="saveCustomer(id.value,name.value,age.value)">Save
Customer</button>
</div>
customers/customer-details/customer-details.component.ts
@Component({
selector: 'app-customer-details',
templateUrl: './customer-details.component.html',
styleUrls: ['./customer-details.component.css']
})
export class CustomerDetailsComponent implements OnInit {
ngOnInit() {
}
removeCustomer(id) {
this.store.dispatch(new DeleteCustomer(id));
}
}
customers/customer-details/customer-details.component.html
<div *ngIf="customer">
<div>
<label>Name: </label> {{customer.name}}
</div>
<div>
47
customers/customers-list/customers-list.component.ts
@Component({
selector: 'app-customers-list',
templateUrl: './customers-list.component.html',
styleUrls: ['./customers-list.component.css']
})
export class CustomersListComponent implements OnInit {
customers: Observable<Customer[]>;
ngOnInit() {
}
customers/customers-list/customers-list.component.html
<div *ngIf="customers">
<h3>Customers</h3>
<div *ngFor="let customer of customers | async">
<app-customer-details [customer]='customer'></app-customer-details>
</div>
48
</div>
app/app.component.ts
<div class="container">
<div style="color: blue;">
<h1>{{title}}</h1>
<h3>{{description}}</h3>
</div>
<div class="row">
<div class="col-sm-4">
<app-create-customer></app-create-customer>
</div>
<div class="col-sm-4">
<app-customers-list></app-customers-list>
</div>
</div>
</div>
49
CONCLUSIONES
recomendable utilizar una arquitectura por capas con un patrón de arquitectura Flux, ya
una organización lógica del negocio que se pueden reutilizar y que se pueden comunicar
● Se pudo ver que el uso del patrón MVVM es bastante útil, ya que se basa en la separación
● Al usar la arquitectura Flux, los datos fluyen en una sola dirección permitiendo tener
● Utilizando funciones puras a través de Redux, se obtiene una sustancial mejora, en lugar
toda la aplicación simultáneamente sin tener que cambiar el estado en cada una de las
● El uso de la librería NgRx es útil, al ser una implementación de Redux hecha para
BIBLIOGRAFÍA
Referencias
[5] Noring, C. (2018). Architecting Angular Applications with Redux, RxJS, and NgRx. Packt
Publishing Ltd.
Sitios Web
[6] Angular. (2018, septiembre 29). Angular - Architecture Overview. Retrieved from
https://angular.io/guide/architecture
us/xamarin/xamarin-forms/enterprise-application-patterns/mvvm
[8] Redux. (2018, Septiembre 29). Redux Org. Retrieved from https://redux.js.org/