{"id":7316,"date":"2021-01-19T20:30:05","date_gmt":"2021-01-19T19:30:05","guid":{"rendered":"http:\/\/www.unimedia.tech.mialias.net\/verwendung-von-redux-mit-angular\/"},"modified":"2023-12-18T13:08:10","modified_gmt":"2023-12-18T12:08:10","slug":"verwendung-von-redux-mit-angular","status":"publish","type":"post","link":"https:\/\/www.unimedia.tech\/de\/verwendung-von-redux-mit-angular\/","title":{"rendered":"Verwendung von Redux mit Angular"},"content":{"rendered":"\n<p><\/p>\n\n\n\n<p>Today we are going to learn how to introduce on using REDUX State management in an Angular Web Application with the NGRX library<\/p>\n\n\n\n<p>REDUX equivalent for Angular is <a href=\"https:\/\/ngrx.io\/\">NGRX<\/a>.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">We will see each building blocks of NGRX step by step<\/h2>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\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=\"NgRx State Management Lifecycle Diagram\"\/><figcaption>Source: https:\/\/ngrx.io\/<\/figcaption><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Store<\/h3>\n\n\n\n<p>The <strong>Store <\/strong>is a controlled state container designed to help write performant and escalable applications on top of Angular.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Effects<\/h3>\n\n\n\n<p>The <strong>Effects <\/strong>use streams to provide&nbsp;<a href=\"https:\/\/martinfowler.com\/eaaDev\/EventSourcing.html\">new sources<\/a>&nbsp;of actions. To modify state based on external interactions such as network requests, web socket messages and time-based events. So they are the prefered method to fetch data and to keep some of the application logic.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Selectors<\/h3>\n\n\n\n<p>The Selectors are pure functions used for obtaining slices of store state. So they select pieces of information from the Store be be consumed by other parts of the application logic.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Reducers<\/h3>\n\n\n\n<p>The Reducers in NgRx are responsible for handling transitions from one state to the next state in your application. Reducer functions handle these transitions by determining which&nbsp;<a href=\"https:\/\/ngrx.io\/guide\/store\/actions\">actions<\/a>&nbsp;to handle based on the action&#8217;s type. In other words, they receive actions with a data payload and the change the state storing the new data as desired.<\/p>\n\n\n\n<p>After understanding basic building blocks of NGRX State Management, now we are going to build an example small chat app with NGRX State Management. <\/p>\n\n\n\n<p>Since, we already have created a chat app earlier In previous post<a href=\"https:\/\/www.unimedia.tech\/2020\/11\/27\/aws-amplify-with-angular-chat\/?lang=de\"> here <\/a>. As a result, we are going to introduce the NGRX State management in it for updating the UI while SENDING \/ RECEIVING the message.<\/p>\n\n\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\n\n<h2 class=\"wp-block-heading\">1. Setup the Project<\/h2>\n\n\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\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Install NGRX Dependencies<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>ng add @ngrx\/store @ngrx\/effects @ngrx\/component<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. Create Actions<\/h2>\n\n\n\n<p>Here, We will create 4 actions that are necessary to manage the state of the chat app.<\/p>\n\n\n\n<p><strong>File<\/strong>: store\/actions\/actions.ts<\/p>\n\n\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\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. Create Effects<\/h2>\n\n\n\n<p><strong>Effects <\/strong>provide a way to interact with those services and isolate them from the components.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Usage<\/h3>\n\n\n\n<p>Effects are useful, If you want to handle tasks such as fetching data, long-running tasks that produce multiple events, and other external interactions.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Note:<\/strong> To remember,  In most scenarios, it will dispatch action(s), But it is not compulsory to always dispatch action(s). <\/p>\n\n\n\n<p>To write effects without dispatching the action(s), pass 2nd parameter to <code><em><strong>createEffect()<\/strong><\/em><\/code> functions with <code><strong><em>{ dispatch: false }<\/em><\/strong><\/code><\/p>\n\n\n\n<p><strong>File:<\/strong> state\/effects\/effects.ts<\/p>\n\n\n\n<p><\/p>\n\n\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\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">5. Create Reducers<\/h2>\n\n\n\n<p>Each reducer function takes the latest&nbsp;<code><a href=\"https:\/\/ngrx.io\/api\/store\/Action\">Action<\/a><\/code>&nbsp;dispatched, the current state, and determines whether to return a newly modified state or the original state.  Now, in the following example we&#8217;ll guide you on how to write reducer functions, register them in your&nbsp;<code><a href=\"https:\/\/ngrx.io\/api\/store\/Store\">Store<\/a><\/code>, and compose feature states.<\/p>\n\n\n\n<p><strong>File:<\/strong> store\/reducers\/reducers.ts<\/p>\n\n\n\n<p><\/p>\n\n\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\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">6. Create Selectors<\/h2>\n\n\n\n<p>The selector that we have created here will return the <strong>observable <\/strong>of all the messages<\/p>\n\n\n\n<p><strong>File:<\/strong> store\/selectors\/selectors.ts<\/p>\n\n\n\n<p><\/p>\n\n\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\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">7. Manage the State<\/h2>\n\n\n\n<p>In this section, We are going to see which are all the events where we need to update the state:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Loading the app<\/li><li>Sending a message<\/li><li>Receiving a message<\/li><\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>File:<\/strong> app.component.ts<\/p>\n\n\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\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Explanation<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li><code>listMessages<\/code> method dispatches<code> loadMessages<\/code> action with <code>channelId<\/code> to fetch all the messages.<\/li><li>When user sends a message, <code>sendMessage<\/code> action is called, and it sends the message.<\/li><li>When user receives a message, <code>addMessageToList<\/code> action is dispatched and it adds the message in <code>messages<\/code> list<\/li><\/ul>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">8. Create Template<\/h2>\n\n\n\n<p>In this section, We are going to use, <code><em><strong>ngrxPush<\/strong><\/em><\/code>&nbsp; pipe from  <code><strong><em>@ngrx\/component<\/em><\/strong><\/code>.<\/p>\n\n\n\n<p>The&nbsp;<code>ngrxPush<\/code>&nbsp;pipe serves as a drop-in replacement for the&nbsp;<code>async<\/code>&nbsp;pipe. <\/p>\n\n\n\n<p><strong><em><code>ngrxPush<\/code>&nbsp; <\/em><\/strong>contains intelligent handling of change detection which will enable us running in zone-full as well as zone-less mode without any changes to the code.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Usage:<\/h3>\n\n\n\n<p>The&nbsp;<code><strong><em>ngrxPush<\/em><\/strong><\/code>&nbsp;pipe is provided through the&nbsp;<code><strong><em>ReactiveComponentModule<\/em><\/strong><\/code>. Therefore to use it add the&nbsp;<strong><em><code>ReactiveComponentModule<\/code>&nbsp;<\/em><\/strong>to the&nbsp;<code>imports<\/code>&nbsp;of your <strong><em>NgModule<\/em><\/strong>.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>File<\/strong>: app.component.html<\/p>\n\n\n\n<p><\/p>\n\n\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\n\n<p><\/p>\n\n\n\n<p>That&#8217;s it, We are now managing the state using NGRX.<\/p>\n\n\n\n<p>Did you enjoy reading this and would like to learn more about angular and redux?, here is another great article, check it out!<\/p>\n\n\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\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Unimedia Technology<\/h3>\n\n\n\n<p>Here at <a href=\"https:\/\/www.unimedia.tech\/?lang=de\">Unimedia Technology<\/a> we have a team of <strong>Angular Developers<\/strong> that can develop your most challenging Web Dashboards and Web apps. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Today we are going to learn how to introduce on using REDUX State management in an Angular Web Application with the NGRX library REDUX equivalent for Angular is NGRX. We will see each building blocks of NGRX step by step Store The Store is a controlled state container designed to help write performant and escalable [&hellip;]<\/p>\n","protected":false},"author":6,"featured_media":6589,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[197,219],"tags":[],"class_list":["post-7316","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-angular-de","category-technical-guides-de"],"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>Verwendung von Redux mit 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\/de\/verwendung-von-redux-mit-angular\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Verwendung von Redux mit Angular\" \/>\n<meta property=\"og:description\" content=\"Today we are going to learn how to introduce on using REDUX State management in an Angular Web Application with the NGRX library REDUX equivalent for Angular is NGRX. We will see each building blocks of NGRX step by step Store The Store is a controlled state container designed to help write performant and escalable [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.unimedia.tech\/de\/verwendung-von-redux-mit-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=\"2023-12-18T12:08:10+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=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Unimedia\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"7\u00a0Minuten\" \/>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Verwendung von Redux mit 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\/de\/verwendung-von-redux-mit-angular\/","og_locale":"de_DE","og_type":"article","og_title":"Verwendung von Redux mit Angular","og_description":"Today we are going to learn how to introduce on using REDUX State management in an Angular Web Application with the NGRX library REDUX equivalent for Angular is NGRX. We will see each building blocks of NGRX step by step Store The Store is a controlled state container designed to help write performant and escalable [&hellip;]","og_url":"https:\/\/www.unimedia.tech\/de\/verwendung-von-redux-mit-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":"2023-12-18T12:08:10+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":{"Verfasst von":"Unimedia","Gesch\u00e4tzte Lesezeit":"7\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.unimedia.tech\/de\/verwendung-von-redux-mit-angular\/#article","isPartOf":{"@id":"https:\/\/www.unimedia.tech\/de\/verwendung-von-redux-mit-angular\/"},"author":{"name":"Unimedia","@id":"https:\/\/www.unimedia.tech\/de\/#\/schema\/person\/3a250aa22526d5c9ff6bc95bb380a5dd"},"headline":"Verwendung von Redux mit Angular","datePublished":"2021-01-19T19:30:05+00:00","dateModified":"2023-12-18T12:08:10+00:00","mainEntityOfPage":{"@id":"https:\/\/www.unimedia.tech\/de\/verwendung-von-redux-mit-angular\/"},"wordCount":680,"publisher":{"@id":"https:\/\/www.unimedia.tech\/de\/#organization"},"image":{"@id":"https:\/\/www.unimedia.tech\/de\/verwendung-von-redux-mit-angular\/#primaryimage"},"thumbnailUrl":"https:\/\/www.unimedia.tech\/wp-content\/uploads\/2023\/12\/How-to-Implement-NGRX-State-Management-in-Angular-Web-Application-4.png","articleSection":["Angular","Technical Guides"],"inLanguage":"de"},{"@type":"WebPage","@id":"https:\/\/www.unimedia.tech\/de\/verwendung-von-redux-mit-angular\/","url":"https:\/\/www.unimedia.tech\/de\/verwendung-von-redux-mit-angular\/","name":"Verwendung von Redux mit Angular - Unimedia Technology","isPartOf":{"@id":"https:\/\/www.unimedia.tech\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.unimedia.tech\/de\/verwendung-von-redux-mit-angular\/#primaryimage"},"image":{"@id":"https:\/\/www.unimedia.tech\/de\/verwendung-von-redux-mit-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":"2023-12-18T12:08:10+00:00","breadcrumb":{"@id":"https:\/\/www.unimedia.tech\/de\/verwendung-von-redux-mit-angular\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.unimedia.tech\/de\/verwendung-von-redux-mit-angular\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.unimedia.tech\/de\/verwendung-von-redux-mit-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\/de\/verwendung-von-redux-mit-angular\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.unimedia.tech\/de\/"},{"@type":"ListItem","position":2,"name":"Verwendung von Redux mit Angular"}]},{"@type":"WebSite","@id":"https:\/\/www.unimedia.tech\/de\/#website","url":"https:\/\/www.unimedia.tech\/de\/","name":"Unimedia Technology","description":"Your software development partner","publisher":{"@id":"https:\/\/www.unimedia.tech\/de\/#organization"},"alternateName":"Unimedia Tech","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.unimedia.tech\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.unimedia.tech\/de\/#organization","name":"Unimedia Technology","alternateName":"Unimedia Tech","url":"https:\/\/www.unimedia.tech\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.unimedia.tech\/de\/#\/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\/de\/#\/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\/de\/#\/schema\/person\/3a250aa22526d5c9ff6bc95bb380a5dd","name":"Unimedia","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.unimedia.tech\/de\/#\/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\/de\/wp-json\/wp\/v2\/posts\/7316","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.unimedia.tech\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.unimedia.tech\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.unimedia.tech\/de\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/www.unimedia.tech\/de\/wp-json\/wp\/v2\/comments?post=7316"}],"version-history":[{"count":0,"href":"https:\/\/www.unimedia.tech\/de\/wp-json\/wp\/v2\/posts\/7316\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.unimedia.tech\/de\/wp-json\/wp\/v2\/media\/6589"}],"wp:attachment":[{"href":"https:\/\/www.unimedia.tech\/de\/wp-json\/wp\/v2\/media?parent=7316"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.unimedia.tech\/de\/wp-json\/wp\/v2\/categories?post=7316"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.unimedia.tech\/de\/wp-json\/wp\/v2\/tags?post=7316"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}