[Angular] Extract Implementation Details of ngrx from an Angular Application with the Facade Pattern
Extracting away the implementation details of ngrx from your components using the facade pattern creates some interesting possibilities in terms of iteratively migrating an application to ngrx. By decoupling your components from ngrx completely, this also makes testing and collaboration a lot easier. In this lesson, we will finalize our application by creating a facade to sit in between our component and ngrx and hide all of the ngrx implementation details away from our component. This has an added benefit of reducing the number of pieces that we need to export in our state module's barrel roll by reducing our dependency down to a single facade.
Current we have the component code like this.. we want to extract implementation detail into facade partten.
component:
import { Component, Input, OnInit, ChangeDetectionStrategy } from '@angular/core';
import { Observable } from 'rxjs'; import {Role} from '../stores/models';
import { Store, select } from '@ngrx/store';
import { DashbaordState, selectAllRoles, LoadRoles } from '../stores'; @Component({
selector: 'dashboard',
templateUrl: './dashboard.component.html',
styleUrls: ['./dashboard.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class DashboardComponent implements OnInit { roles$: Observable<Role[]>;
constructor(
private store: Store<DashbaordState>
) {
this.roles$ = this.store.pipe(
select(selectAllRoles)
);
} ngOnInit() {
this.store.dispatch(new LoadRoles());
} }
Create a facade.ts file:
import { Injectable } from "@angular/core";
import { Store, select } from '@ngrx/store';
import { DashbaordState } from '../reducers';
import { Observable } from 'rxjs';
import { Role } from '../models';
import { selectAllRoles } from '../selectors';
import { LoadRoles } from '../actions'; @Injectable({
providedIn: 'root'
})
export class DashboardFacade {
roles$: Observable<Role[]>;
constructor(
private store: Store<DashbaordState>
) {
this.roles$ = store.pipe(
select(selectAllRoles)
);
} getRoles () {
this.store.dispatch(new LoadRoles());
}
}
Basiclly just move all the Store related code to the facede service.
Update the component:
import { Component, Input, OnInit, ChangeDetectionStrategy } from '@angular/core';
import { Observable } from 'rxjs'; import {Role} from '../stores/models';
import { Store, select } from '@ngrx/store';
import { DashbaordState, selectAllRoles, LoadRoles } from '../stores';
import { DashboardFacade } from '../stores/facades/dashboard.facade'; @Component({
selector: 'dashboard',
templateUrl: './dashboard.component.html',
styleUrls: ['./dashboard.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class DashboardComponent implements OnInit { roles$: Observable<Role[]>; constructor(
private facade: DashboardFacade
) {
this.roles$ = this.facade.roles$;
} ngOnInit() {
this.facade.getRoles();
}
}
[Angular] Extract Implementation Details of ngrx from an Angular Application with the Facade Pattern的更多相关文章
- Accessor Search Implementation Details
[Accessor Search Implementation Details] Key-value coding attempts to use accessor methods to get an ...
- 17.2.1 Replication Implementation Details 复制实现细节:
17.2 Replication Implementation 复制是基于master server 跟踪所有改变到他的数据库(更新,删除等等)在它的binary log. binary log 作为 ...
- NgRx/Store 4 + Angular 5使用教程
这篇文章将会示范如何使用NgRx/Store 4和Angular5.@ngrx/store是基于RxJS的状态管理库,其灵感来源于Redux.在NgRx中,状态是由一个包含action和reducer ...
- [Angular] Improve Server Communication in Ngrx Effects with NX Data Persistence in Angular
Communicating with a remote server via HTTP presents an extra level of complexity as there is an inc ...
- Angular应用架构设计-3:Ngrx Store
这是有关Angular应用架构设计系列文章中的一篇,在这个系列当中,我会结合这近两年中对Angular.Ionic.甚至Vuejs等框架的使用经验,总结在应用设计和开发过程中遇到的问题.和总结的经验, ...
- angular的跨域(angular百度下拉提示模拟)和angular选项卡
1.angular中$http的服务: $http.get(url,{params:{参数}}).success().error(); $http.post(url,{params:{参数}}).su ...
- angular 2+ 变化检测系列三(Zone.js在Angular中的应用)
在系列一中,我们提到Zone.js,Zones是一种执行上下文,它允许我们设置钩子函数在我们的异步任务的开始位置和结束位置,Angular正是利用了这一特性从而实现了变更检测. Zones.js非常适 ...
- 【Angular JS】正确调用JQuery与Angular JS脚本 - 修复Warning: Tired to load angular more than once
自己正在做一个小网站,使用Angular JS + Express JS + Mongo DB,在开发过程中,遇到一些问题,所以整理出来.希望对大家都有帮助. 这是今天解决的一个问题,Angular ...
- [Angular] Step-By-Step Implementation of a Structural Directive - Learn ViewContainerRef
For example we have two buttons: When we click nether one of those tow button, the modal should show ...
随机推荐
- .net core 2.0学习记录(四):Middleware使用以及模拟构建Middleware(RequestDelegate)管道
.net Core中没有继续沿用以前asp.net中的管道事件,而是开发了一个新的管道(Middleware): public class MiddlewareDemo { private reado ...
- 前端javascript实现二进制读写操作
由于种种原因,在浏览器中无法像nodejs那样操作二进制. 最近写了一个在浏览器端操作读写二进制的帮助类 !function (entrance) { "use strict"; ...
- php打开错误日志
ini_set("display_errors", "On"); error_reporting(E_ALL | E_STRICT);
- 推荐开源靶场Vulhub
转:https://github.com/phith0n/vulhub Vulhub - Some Docker-Compose files for vulnerabilities environme ...
- SecureCRT、Xmanager对Linux上传下载文件或文件夹
(1).SecureCRT SecureCRT对Linux上传下载文件或文件夹拥有一个专门的软件SecureFXPortable.对于它来说只有两个的难题,一个是版本问题,尽量去官网下载最近版本:另一 ...
- shell 执行结果赋给变量
#将pwd的执行结果放到变量value中保存, value=$(pwd) 另一种方法: value=`pwd`
- asp总结
什么是ASP.NET? ASP.NET是.NET FrameWork的一部分,是一项微软公司的技术,是一种使嵌入网页中的脚本可由因特网服务器执行的服务器端脚本技术,它可以在通过HTTP请求文档时再在W ...
- [CODECHEF]LCM
题意:询问满足$1\leq x\leq n,1\leq y\leq m$且$x,y$均无平方因子的有序对$(x,y)$的$[x,y]$之和,多组数据 以下假设$n\leq m$,设$S(n)=\fra ...
- 【哈希】CDOJ1717 京电的神秘矩阵
对每个矩阵里的元素用两个大素数做双关键字哈希,丢进set即可. #include<cstdio> #include<iostream> #include<set> ...
- 20162312 实验一 Linux基础与Java开发环境
实 验 报 告 课程:程序设计与数据结构 姓名:张家铖 班级:1623 学号:20162312 实验名称: Linux基础与Java开发环境 实验器材:msi GL62M 7RD 实验目的与要求:1. ...