{"id":7236,"date":"2021-01-19T20:30:05","date_gmt":"2021-01-19T19:30:05","guid":{"rendered":"http:\/\/www.unimedia.tech.mialias.net\/using-redux-with-angular\/"},"modified":"2024-01-09T15:36:53","modified_gmt":"2024-01-09T14:36:53","slug":"using-redux-with-angular","status":"publish","type":"post","link":"https:\/\/www.unimedia.tech\/es\/using-redux-with-angular\/","title":{"rendered":"Uso de Redux con Angular"},"content":{"rendered":"\n<p><\/p>\n\n<p>Hoy vamos a aprender a introducir en el uso de REDUX <a href=\"https:\/\/www.unimedia.tech\/dedicated-development-teams\/\">gesti\u00f3n de<\/a> estados<a href=\"https:\/\/www.unimedia.tech\/business-development-manager\/\"> <\/a>en una aplicaci\u00f3n web Angular con la biblioteca NGRX<\/p>\n\n<p>El equivalente de REDUX para Angular es <a href=\"https:\/\/ngrx.io\/\">NGRX<\/a>.<\/p>\n\n<p>Tambi\u00e9n le puede interesar: <a href=\"https:\/\/www.unimedia.tech\/2022\/02\/01\/unimedia-named-as-tech-leaders-by-clutch\/\">&#8220;Unimedia nombrada l\u00edder tecnol\u00f3gico por Clutch&#8221;<\/a><\/p>\n\n<p>Adem\u00e1s, nuestro equipo de desarrolladores es experto en <a href=\"https:\/\/www.unimedia.tech\/software-development\/\">crear software a medida<\/a> seg\u00fan los requisitos del proyecto.<\/p>\n\n<p><\/p>\n\n<h2 class=\"wp-block-heading\">Veremos paso a paso cada uno de los componentes b\u00e1sicos de NGRX<\/h2>\n\n<p><\/p>\n\n<p><\/p>\n\n<p><\/p>\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/www.unimedia.tech\/wp-content\/uploads\/2023\/12\/state-management-lifecycle.png\" alt=\"Diagrama del ciclo de vida de la gesti&#xF3;n de estados de NgRx\"\/><figcaption>Fuente: https:\/\/ngrx.io\/<\/figcaption><\/figure>\n\n<p><\/p>\n\n<h3 class=\"wp-block-heading\">Tienda<\/h3>\n\n<p>The <strong>Store <\/strong>es un contenedor de estado controlado dise\u00f1ado para ayudar a escribir aplicaciones escalables y de alto rendimiento sobre Angular.<\/p>\n\n<p><\/p>\n\n<h3 class=\"wp-block-heading\">Efectos<\/h3>\n\n<p>Los <strong>Efectos <\/strong>utilizan los flujos para proporcionar <a href=\"https:\/\/martinfowler.com\/eaaDev\/EventSourcing.html\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">nuevas fuentes<\/a> de acciones. Modificar el estado en funci\u00f3n de interacciones externas como solicitudes de red, mensajes de socket <a href=\"https:\/\/www.factoriacreativabarcelona.es\/diseno-web-barcelona\/\">web<\/a> y eventos temporales. Por lo tanto, son el m\u00e9todo preferido para obtener datos y mantener parte de la l\u00f3gica de la aplicaci\u00f3n.<\/p>\n\n<p><\/p>\n\n<h3 class=\"wp-block-heading\">Selectores<\/h3>\n\n<p>Los selectores son funciones puras que se utilizan para obtener porciones del estado de la tienda. As\u00ed, seleccionan piezas de informaci\u00f3n del Almac\u00e9n para que sean consumidas por otras partes de la l\u00f3gica de la aplicaci\u00f3n.<\/p>\n\n<p><\/p>\n\n<h3 class=\"wp-block-heading\">Reductores<\/h3>\n\n<p>Los Reductores en NgRx son responsables de manejar las transiciones de un estado al siguiente estado en tu aplicaci\u00f3n. Las funciones reductoras gestionan estas transiciones determinando qu\u00e9 <a href=\"https:\/\/ngrx.io\/guide\/store\/actions\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">acciones <\/a>gestionar en funci\u00f3n del tipo de acci\u00f3n. En otras palabras, reciben acciones con una carga de datos y cambian el estado almacenando los nuevos datos seg\u00fan se desee.<\/p>\n\n<p>Despu\u00e9s de entender los bloques de construcci\u00f3n b\u00e1sicos de NGRX State Management, ahora vamos a construir una peque\u00f1a aplicaci\u00f3n de chat de ejemplo con NGRX State Management. <\/p>\n\n<p>Dado que, ya hemos creado una aplicaci\u00f3n de chat antes En el post anterior<a href=\"https:\/\/www.unimedia.tech\/2020\/11\/27\/aws-amplify-with-angular-chat\/\"> aqu\u00ed . <\/a> Como resultado, vamos a introducir la gesti\u00f3n de estado NGRX en \u00e9l para la actualizaci\u00f3n de la interfaz de usuario, mientras que el env\u00edo \/ recepci\u00f3n del mensaje.<\/p>\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-unimedia-technology wp-block-embed-unimedia-technology\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/www.unimedia.tech\/2020\/11\/27\/aws-amplify-with-angular-chat\/\n<\/div><\/figure>\n\n<h2 class=\"wp-block-heading\">1. Configurar el proyecto<\/h2>\n\n<pre class=\"wp-block-code\"><code>\/** Clone Repo *\/\ngit clone https:\/\/github.com\/unimedia-technology\/amplify-chat-angular.git\n\n\/** Enter into project directory *\/\ncd amplify-chat-angular\n\n\/** Install the dependencies *\/\nnpm i\n\n\/** Create a new git branch *\/\ngit checkout ngrx\n<\/code><\/pre>\n\n<p><\/p>\n\n<p><\/p>\n\n<h2 class=\"wp-block-heading\">2. Instalar las dependencias de NGRX<\/h2>\n\n<pre class=\"wp-block-code\"><code>ng add @ngrx\/store @ngrx\/effects @ngrx\/component<\/code><\/pre>\n\n<p><\/p>\n\n<p><\/p>\n\n<p><\/p>\n\n<h2 class=\"wp-block-heading\">3. Crear acciones<\/h2>\n\n<p>Aqu\u00ed, vamos a crear 4 acciones que son necesarias para gestionar el estado de la aplicaci\u00f3n de chat.<\/p>\n\n<p><strong>Archivo<\/strong>: store\/actions\/actions.ts<\/p>\n\n<pre class=\"wp-block-code\"><code>import { createAction, props } from '@ngrx\/store';\n\nexport const loadMessages = createAction('&#91;Chat] Load Messages', props&lt;{ channelId: string }&gt;());\nexport const loadMessagesSuccess = createAction('&#91;Chat] Load Messages Success', props&lt;{ messages: any&#91;] }&gt;());\n\nexport const sendMessage = createAction('&#91;Chat] Send Message', props&lt;{ message }&gt;());\nexport const addMessageToList = createAction('&#91;Chat] Add Message To List', props&lt;{ message }&gt;());<\/code><\/pre>\n\n<p><\/p>\n\n<p><\/p>\n\n<p><\/p>\n\n<h2 class=\"wp-block-heading\">4. Crear efectos<\/h2>\n\n<p><strong>Los efectos <\/strong>proporcionan una forma de interactuar con esos servicios y aislarlos de los componentes.<\/p>\n\n<h3 class=\"wp-block-heading\">Utilizaci\u00f3n<\/h3>\n\n<p>Los efectos son \u00fatiles, Si desea manejar tareas como la obtenci\u00f3n de datos, tareas de larga duraci\u00f3n que producen m\u00faltiples eventos, y otras interacciones externas.<\/p>\n\n<p><\/p>\n\n<p><strong>Nota:<\/strong> Para recordar, en la mayor\u00eda de los escenarios, enviar\u00e1 acci\u00f3n(es), pero no es obligatorio enviar siempre acci\u00f3n(es). <\/p>\n\n<p>Para escribir efectos sin enviar la(s) acci\u00f3n(es), pase el segundo par\u00e1metro a las funciones <code><em><strong>createEffect()<\/strong><\/em><\/code> con <code><strong><em>{ dispatch: false }<\/em><\/strong><\/code><\/p>\n\n<p><strong>Archivo:<\/strong> state\/effects\/effects.ts<\/p>\n\n<p><\/p>\n\n<pre class=\"wp-block-code\"><code>import { Actions, createEffect, ofType } from '@ngrx\/effects';\nimport { Injectable } from '@angular\/core';\nimport { map, switchMap } from 'rxjs\/operators';\nimport * as chatActions from '..\/actions\/actions';\nimport { from } from 'rxjs';\nimport { APIService } from '..\/..\/API.service';\n\n@Injectable()\nexport class ChatEffects {\n\n  constructor(\n    private actions$: Actions,\n    private api: APIService,\n  ) { }\n\n  \/** Load the List of Messages *\/\n  loadMessages$ = createEffect(() =&gt; this.actions$.pipe(\n    ofType(chatActions.loadMessages),\n    switchMap(({ channelId }) =&gt; {\n      return from(this.api.MessagesByChannelId(channelId)).pipe(\n        map((res: any) =&gt; {\n          return chatActions.loadMessagesSuccess({ messages: res.items });\n        }),\n      );\n    })\n  ));\n\n  \/** Send message and call no actions *\/\n  sendMessage$ = createEffect(() =&gt; this.actions$.pipe(\n    ofType(chatActions.sendMessage),\n    switchMap(({ message }) =&gt; {\n      return from(this.api.CreateMessage(message));\n    })\n  ), { dispatch: false });\n}<\/code><\/pre>\n\n<p><\/p>\n\n<p><\/p>\n\n<h2 class=\"wp-block-heading\">5. Crear reductores<\/h2>\n\n<p>Cada funci\u00f3n reductora toma el \u00faltimo <code><a href=\"https:\/\/ngrx.io\/api\/store\/Action\">Action<\/a><\/code> enviado, el estado actual, y determina si devuelve un estado reci\u00e9n modificado o el estado original. Ahora, en el siguiente ejemplo te guiaremos sobre c\u00f3mo escribir funciones reductoras, registrarlas en tu <code><a href=\"https:\/\/ngrx.io\/api\/store\/Store\">Store<\/a><\/code>, y componer estados de funciones.<\/p>\n\n<p><strong>Archivo:<\/strong> store\/reducers\/reducers.ts<\/p>\n\n<p><\/p>\n\n<pre class=\"wp-block-code\"><code>import { Action, createReducer, on } from '@ngrx\/store';\nimport * as chatActions from '..\/actions\/actions';\n\nexport interface IChatState {\n  messages: any&#91;];\n}\n\n\/** Initial State *\/\nexport const initialState: IChatState = {\n  messages: &#91;],\n};\n\nexport function chatReducer(state: IChatState | undefined, action: Action): IChatState {\n  return reducer(state, action);\n}\n\nconst reducer = createReducer&lt;IChatState&gt;(\n  initialState,\n\n  \/** Loaded Messafes *\/\n  on(chatActions.loadMessagesSuccess, (state, { messages }) =&gt; ({\n    ...state,\n    messages\n  })),\n\n  \/** Add message to the messages array *\/\n  on(chatActions.addMessageToList, (state, { message }) =&gt; ({\n    ...state,\n    messages: &#91;...state.messages, message]\n  })),\n);\n<\/code><\/pre>\n\n<p><\/p>\n\n<p><\/p>\n\n<h2 class=\"wp-block-heading\">6. Crear selectores<\/h2>\n\n<p>El selector que hemos creado aqu\u00ed devolver\u00e1 el <strong>observable <\/strong>de todos los mensajes<\/p>\n\n<p><strong>Archivo:<\/strong> store\/selectors\/selectors.ts<\/p>\n\n<p><\/p>\n\n<pre class=\"wp-block-code\"><code>import { createSelector } from '@ngrx\/store';\n\nexport const selectChatState = (state) =&gt; state;\n\nexport const selectMessages = createSelector(\n  selectChatState,\n  (state) =&gt; state.chat.messages\n);\n<\/code><\/pre>\n\n<p><\/p>\n\n<p><\/p>\n\n<h2 class=\"wp-block-heading\">7. Gestionar el Estado<\/h2>\n\n<p>En esta secci\u00f3n, vamos a ver cuales son todos los eventos donde necesitamos actualizar el estado:<\/p>\n\n<ul class=\"wp-block-list\"><li>Cargar la aplicaci\u00f3n<\/li><li>Enviar un mensaje<\/li><li>Recibir un mensaje<\/li><\/ul>\n\n<p><\/p>\n\n<p><strong>Archivo:<\/strong> app.component.ts<\/p>\n\n<pre class=\"wp-block-code\"><code>import { Component, OnInit } from '@angular\/core';\nimport { NavigationEnd, Router, RouterEvent } from '@angular\/router';\nimport { select, Store } from '@ngrx\/store';\nimport { Observable } from 'rxjs';\nimport { delay } from 'rxjs\/operators';\nimport { APIService } from '.\/API.service';\nimport { addMessageToList, loadMessages, sendMessage } from '.\/store\/actions\/actions';\nimport { IChatState } from '.\/store\/reducers\/reducer';\nimport { selectMessages } from '.\/store\/selectors\/selectors';\n\n@Component({\n  selector: 'app-root',\n  templateUrl: '.\/app.component.html',\n  styleUrls: &#91;'.\/app.component.scss']\n})\nexport class AppComponent implements OnInit {\n  title = 'amplify-chat-angular';\n  username: string;\n  messages: Observable&lt;any&#91;]&gt;;\n\n  constructor(\n    private api: APIService,\n    private router: Router,\n    private store: Store&lt;IChatState&gt;\n  ) { }\n\n  ngOnInit(): void {\n    this.router.events.subscribe((events: RouterEvent) =&gt; {\n      if (events instanceof NavigationEnd) {\n        const qParams = this.router.routerState.snapshot.root.queryParams;\n        if (qParams &amp;&amp; qParams.user) {\n          this.username = qParams.user;\n        } else {\n          this.router.navigate(&#91;'\/'], { queryParams: { user: 'Dave' } });\n        }\n      }\n    });\n\n    this.listMessages();\n    this.onCreateMessage();\n  }\n\n  send(event, inputElement: HTMLInputElement): void {\n    event.preventDefault();\n    event.stopPropagation();\n    const input = {\n      channelID: '2',\n      author: this.username.trim(),\n      body: inputElement.value.trim()\n    };\n\n    this.store.dispatch(sendMessage({ message: input }));\n    inputElement.value = '';\n  }\n\n  listMessages(): void {\n    this.store.dispatch(loadMessages({ channelId: '2' }));\n    this.messages = this.store.pipe(\n      select(selectMessages),\n      delay(10)\n    );\n  }\n\n  onCreateMessage(): void {\n    this.api.OnCreateMessageListener.subscribe(\n      {\n        next: (val: any) =&gt; {\n          console.log(val);\n          this.store.dispatch(addMessageToList({ message: val.value.data.onCreateMessage }));\n        }\n      }\n    );\n  }\n}<\/code><\/pre>\n\n<p><\/p>\n\n<p><\/p>\n\n<h3 class=\"wp-block-heading\">Explicaci\u00f3n<\/h3>\n\n<ul class=\"wp-block-list\"><li><code>listMessages<\/code> env\u00eda la acci\u00f3n<code> loadMessages<\/code> con <code>channelId<\/code> para recuperar todos los mensajes.<\/li><li>Cuando el usuario env\u00eda un mensaje, se llama a la acci\u00f3n <code>sendMessage<\/code>, que env\u00eda el mensaje.<\/li><li>Cuando el usuario recibe un mensaje, se env\u00eda la acci\u00f3n <code>addMessageToList<\/code> y se a\u00f1ade el mensaje a la lista <code>messages<\/code>.<\/li><\/ul>\n\n<p><\/p>\n\n<h2 class=\"wp-block-heading\">8. Crear plantilla<\/h2>\n\n<p>En esta secci\u00f3n, vamos a utilizar, <code><em><strong>ngrxPush<\/strong><\/em><\/code> tuber\u00eda de <code><strong><em>@ngrx\/component<\/em><\/strong><\/code>.<\/p>\n\n<p>El tubo <code>ngrxPush<\/code> sirve como sustituto del tubo <code>async<\/code>. <\/p>\n\n<p><strong><em><code>ngrxPush<\/code>  <\/em><\/strong>contiene un manejo inteligente de la detecci\u00f3n de cambios que nos permitir\u00e1 funcionar tanto en modo de zona llena como de zona vac\u00eda sin ning\u00fan cambio en el c\u00f3digo.<\/p>\n\n<h3 class=\"wp-block-heading\">Uso:<\/h3>\n\n<p>La tuber\u00eda <code><strong><em>ngrxPush<\/em><\/strong><\/code> se suministra a trav\u00e9s de <code><strong><em>ReactiveComponentModule<\/em><\/strong><\/code>. Por lo tanto, para utilizarlo, a\u00f1ada el <strong><em><code>ReactiveComponentModule<\/code> <\/em><\/strong>a la direcci\u00f3n <code>imports<\/code> de su <strong><em>NgModule<\/em><\/strong>.<\/p>\n\n<p><\/p>\n\n<p><strong>Archivo<\/strong>: app.component.html<\/p>\n\n<p><\/p>\n\n<pre class=\"wp-block-code\"><code>&lt;div id=\"root\"&gt;\n  &lt;div class=\"container\"&gt;\n    &lt;div class=\"messages\"&gt;\n      &lt;div class=\"messages-scroller\"&gt;\n        &lt;ng-container *ngIf=\"messages$ | async as messages\"&gt;\n          &lt;ng-container *ngFor=\"let message of messages\"&gt;\n            &lt;div &#91;ngClass]=\"message.author === username ? 'message me' : 'message'\"&gt;\n              {{message.body}}\n            &lt;\/div&gt;\n          &lt;\/ng-container&gt;\n        &lt;\/ng-container&gt;\n      &lt;\/div&gt;\n\n    &lt;\/div&gt;\n    &lt;div class=\"chat-bar\"&gt;\n      &lt;div class=\"form\"&gt;\n        &lt;input #messageInput type=\"text\" name=\"messageBody\" placeholder=\"Type your message here\" value=\"\n          (keyup.enter)=\"send($event, messageInput)\" \/&gt;\n      &lt;\/div&gt;\n    &lt;\/div&gt;\n  &lt;\/div&gt;\n&lt;\/div&gt;<\/code><\/pre>\n\n<p><\/p>\n\n<p>Eso es todo, ahora estamos gestionando el estado utilizando NGRX.<\/p>\n\n<p>\u00bfTe ha gustado leer esto y te gustar\u00eda aprender m\u00e1s sobre angular y redux?, aqu\u00ed tienes otro gran art\u00edculo, \u00a1\u00e9chale un vistazo!<\/p>\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/www.toptal.com\/angular\/why-use-ngrx\">https:\/\/www.toptal.com\/angular\/why-use-ngrx<\/a><\/li><\/ul>\n\n<p><\/p>\n\n<h3 class=\"wp-block-heading\">Unimedia Technology<\/h3>\n\n<p>Aqu\u00ed en <a href=\"https:\/\/www.unimedia.tech\/\">Unimedia Technology<\/a> tenemos un equipo de <strong>desarrolladores Angular<\/strong> que pueden desarrollar sus m\u00e1s desafiantes Web Dashboards y Web apps. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hoy vamos a aprender a introducir en el uso de REDUX gesti\u00f3n de estados en una aplicaci\u00f3n web Angular con la biblioteca NGRX El equivalente de REDUX para Angular es NGRX. Tambi\u00e9n le puede interesar: &#8220;Unimedia nombrada l\u00edder tecnol\u00f3gico por Clutch&#8221; Adem\u00e1s, nuestro equipo de desarrolladores es experto en crear software a medida seg\u00fan los [&hellip;]<\/p>\n","protected":false},"author":6,"featured_media":6590,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[198,220],"tags":[253,252],"class_list":["post-7236","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-angular-es","category-technical-guides-es","tag-gestion-estatal","tag-ngrx-es"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.6 (Yoast SEO v27.1.1) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Uso de Redux con Angular - Unimedia Technology<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.unimedia.tech\/es\/using-redux-with-angular\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Uso de Redux con Angular\" \/>\n<meta property=\"og:description\" content=\"Hoy vamos a aprender a introducir en el uso de REDUX gesti\u00f3n de estados en una aplicaci\u00f3n web Angular con la biblioteca NGRX El equivalente de REDUX para Angular es NGRX. Tambi\u00e9n le puede interesar: &#8220;Unimedia nombrada l\u00edder tecnol\u00f3gico por Clutch&#8221; Adem\u00e1s, nuestro equipo de desarrolladores es experto en crear software a medida seg\u00fan los [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.unimedia.tech\/es\/using-redux-with-angular\/\" \/>\n<meta property=\"og:site_name\" content=\"Unimedia Technology\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.linkedin.com\/company\/unimedia-technology\/\" \/>\n<meta property=\"article:published_time\" content=\"2021-01-19T19:30:05+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-01-09T14:36:53+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.unimedia.tech\/wp-content\/uploads\/2023\/12\/How-to-Implement-NGRX-State-Management-in-Angular-Web-Application-4.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1120\" \/>\n\t<meta property=\"og:image:height\" content=\"660\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Unimedia\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@UnimediaCTO\" \/>\n<meta name=\"twitter:site\" content=\"@UnimediaCTO\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Unimedia\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutos\" \/>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Uso de Redux con Angular - Unimedia Technology","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.unimedia.tech\/es\/using-redux-with-angular\/","og_locale":"es_ES","og_type":"article","og_title":"Uso de Redux con Angular","og_description":"Hoy vamos a aprender a introducir en el uso de REDUX gesti\u00f3n de estados en una aplicaci\u00f3n web Angular con la biblioteca NGRX El equivalente de REDUX para Angular es NGRX. Tambi\u00e9n le puede interesar: &#8220;Unimedia nombrada l\u00edder tecnol\u00f3gico por Clutch&#8221; Adem\u00e1s, nuestro equipo de desarrolladores es experto en crear software a medida seg\u00fan los [&hellip;]","og_url":"https:\/\/www.unimedia.tech\/es\/using-redux-with-angular\/","og_site_name":"Unimedia Technology","article_publisher":"https:\/\/www.linkedin.com\/company\/unimedia-technology\/","article_published_time":"2021-01-19T19:30:05+00:00","article_modified_time":"2024-01-09T14:36:53+00:00","og_image":[{"width":1120,"height":660,"url":"https:\/\/www.unimedia.tech\/wp-content\/uploads\/2023\/12\/How-to-Implement-NGRX-State-Management-in-Angular-Web-Application-4.png","type":"image\/png"}],"author":"Unimedia","twitter_card":"summary_large_image","twitter_creator":"@UnimediaCTO","twitter_site":"@UnimediaCTO","twitter_misc":{"Escrito por":"Unimedia","Tiempo de lectura":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.unimedia.tech\/es\/using-redux-with-angular\/#article","isPartOf":{"@id":"https:\/\/www.unimedia.tech\/es\/using-redux-with-angular\/"},"author":{"name":"Unimedia","@id":"https:\/\/www.unimedia.tech\/es\/#\/schema\/person\/3a250aa22526d5c9ff6bc95bb380a5dd"},"headline":"Uso de Redux con Angular","datePublished":"2021-01-19T19:30:05+00:00","dateModified":"2024-01-09T14:36:53+00:00","mainEntityOfPage":{"@id":"https:\/\/www.unimedia.tech\/es\/using-redux-with-angular\/"},"wordCount":781,"commentCount":0,"publisher":{"@id":"https:\/\/www.unimedia.tech\/es\/#organization"},"image":{"@id":"https:\/\/www.unimedia.tech\/es\/using-redux-with-angular\/#primaryimage"},"thumbnailUrl":"https:\/\/www.unimedia.tech\/wp-content\/uploads\/2023\/12\/How-to-Implement-NGRX-State-Management-in-Angular-Web-Application-4.png","keywords":["gesti\u00f3n estatal","ngrx"],"articleSection":["Angular","Technical Guides"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.unimedia.tech\/es\/using-redux-with-angular\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.unimedia.tech\/es\/using-redux-with-angular\/","url":"https:\/\/www.unimedia.tech\/es\/using-redux-with-angular\/","name":"Uso de Redux con Angular - Unimedia Technology","isPartOf":{"@id":"https:\/\/www.unimedia.tech\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.unimedia.tech\/es\/using-redux-with-angular\/#primaryimage"},"image":{"@id":"https:\/\/www.unimedia.tech\/es\/using-redux-with-angular\/#primaryimage"},"thumbnailUrl":"https:\/\/www.unimedia.tech\/wp-content\/uploads\/2023\/12\/How-to-Implement-NGRX-State-Management-in-Angular-Web-Application-4.png","datePublished":"2021-01-19T19:30:05+00:00","dateModified":"2024-01-09T14:36:53+00:00","breadcrumb":{"@id":"https:\/\/www.unimedia.tech\/es\/using-redux-with-angular\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.unimedia.tech\/es\/using-redux-with-angular\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.unimedia.tech\/es\/using-redux-with-angular\/#primaryimage","url":"https:\/\/www.unimedia.tech\/wp-content\/uploads\/2023\/12\/How-to-Implement-NGRX-State-Management-in-Angular-Web-Application-4.png","contentUrl":"https:\/\/www.unimedia.tech\/wp-content\/uploads\/2023\/12\/How-to-Implement-NGRX-State-Management-in-Angular-Web-Application-4.png","width":1120,"height":660,"caption":"How to Implement NGRX State Management in Angular Web Application"},{"@type":"BreadcrumbList","@id":"https:\/\/www.unimedia.tech\/es\/using-redux-with-angular\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.unimedia.tech\/es\/"},{"@type":"ListItem","position":2,"name":"Uso de Redux con Angular"}]},{"@type":"WebSite","@id":"https:\/\/www.unimedia.tech\/es\/#website","url":"https:\/\/www.unimedia.tech\/es\/","name":"Unimedia Technology","description":"Your software development partner","publisher":{"@id":"https:\/\/www.unimedia.tech\/es\/#organization"},"alternateName":"Unimedia Tech","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.unimedia.tech\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.unimedia.tech\/es\/#organization","name":"Unimedia Technology","alternateName":"Unimedia Tech","url":"https:\/\/www.unimedia.tech\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.unimedia.tech\/es\/#\/schema\/logo\/image\/","url":"https:\/\/www.unimedia.tech\/wp-content\/uploads\/2023\/12\/cloud_border-3.png","contentUrl":"https:\/\/www.unimedia.tech\/wp-content\/uploads\/2023\/12\/cloud_border-3.png","width":403,"height":309,"caption":"Unimedia Technology"},"image":{"@id":"https:\/\/www.unimedia.tech\/es\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.linkedin.com\/company\/unimedia-technology\/","https:\/\/x.com\/UnimediaCTO","https:\/\/www.instagram.com\/unimedia.technology\/"]},{"@type":"Person","@id":"https:\/\/www.unimedia.tech\/es\/#\/schema\/person\/3a250aa22526d5c9ff6bc95bb380a5dd","name":"Unimedia","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.unimedia.tech\/es\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/5901fd1c4628e2b48ffd4e47324e8fe0751b39e556a167f078471d4c4bec0f6f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5901fd1c4628e2b48ffd4e47324e8fe0751b39e556a167f078471d4c4bec0f6f?s=96&d=mm&r=g","caption":"Unimedia"}}]}},"_links":{"self":[{"href":"https:\/\/www.unimedia.tech\/es\/wp-json\/wp\/v2\/posts\/7236","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.unimedia.tech\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.unimedia.tech\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.unimedia.tech\/es\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/www.unimedia.tech\/es\/wp-json\/wp\/v2\/comments?post=7236"}],"version-history":[{"count":0,"href":"https:\/\/www.unimedia.tech\/es\/wp-json\/wp\/v2\/posts\/7236\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.unimedia.tech\/es\/wp-json\/wp\/v2\/media\/6590"}],"wp:attachment":[{"href":"https:\/\/www.unimedia.tech\/es\/wp-json\/wp\/v2\/media?parent=7236"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.unimedia.tech\/es\/wp-json\/wp\/v2\/categories?post=7236"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.unimedia.tech\/es\/wp-json\/wp\/v2\/tags?post=7236"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}