参考 ngrx 官网:https://ngrx.io/guide/effects#registering-root-effects

Comparison with component-based side effects

在基于服务的应用程序中,您的组件通过许多不同的服务与数据交互,这些服务通过属性和方法公开数据。 这些服务可能依赖于管理其他数据集的其他服务。 您的组件使用这些服务来执行任务,从而赋予您的组件许多职责——违反了设计的单一职责原理。

想象一下,您的应用程序管理电影。 这是一个获取并显示电影列表的组件。

@Component({template: `<li *ngFor="let movie of movies">{{ movie.name }}</li>`
})
export class MoviesPageComponent {movies: Movie[];constructor(private movieService: MoviesService) {}ngOnInit() {this.movieService.getAll().subscribe(movies => this.movies = movies);}
}

service 实现,负责读取 movies:

@Injectable({providedIn: 'root'
})
export class MoviesService {constructor (private http: HttpClient) {}getAll() {return this.http.get('/movies');}
}

这一个小小的 Component,就做了如下许多事情:

  • 管理电影的状态。
  • 使用该服务执行副作用,访问外部 API 以获取电影。
  • 更改组件内电影的状态。

引入 Store 和 Effect 的好处

与 Store 一起使用时,Effects 会减少 Component 的责任。 在更大的应用程序中,这变得更加重要,因为您有多个数据源,需要多个服务来获取这些数据,而服务可能依赖于其他服务。

Effects 处理外部数据和交互,允许您的服务实现达到 less stateful 的效果,并且只执行与外部交互相关的任务。 接下来,重构组件以将共享的电影数据放入 Store。 Effects 处理电影数据的获取。

重构后的 Component 实现:

@Component({template: `<div *ngFor="let movie of movies$ | async">{{ movie.name }}</div>`
})
export class MoviesPageComponent {movies$: Observable<Movie[]> = this.store.select(state => state.movies);constructor(private store: Store<{ movies: Movie[] }>) {}ngOnInit() {this.store.dispatch({ type: '[Movies Page] Load Movies' });}
}

电影仍然通过 MoviesService 获取,但现在组件不再关心如何获取和加载电影。 它只负责声明其加载电影的意图,并使用 selector 访问电影列表数据。

Effects 是获取电影的异步活动发生的地方。 您的组件变得更容易测试并且对它需要的数据负责。

为什么在大型 Angular 应用里我们需要使用 ngrx相关推荐

  1. Angular 项目里 angular.json 文件内容的学习笔记

    看一个基于 Angular 的 SAP Spartacus 项目里 angular.json 的例子: version: The configuration-file version. newProj ...

  2. Angular应用里setTimeout被如何被monkey patched的

    monkey patched: monkey patch指的是在运行时动态替换,一般是在startup的时候. 下面的测试代码可以让我们弄清楚,浏览器支持的原生函数setTimeout,是如何在Ang ...

  3. Angular应用里的tsconfig.app.json

    tsconfig.app.json是tsconfig.json的扩展: 在应用工程文件angular.json里的tsConfig字段处被引用: ng build后的输出: 2020年10月4日国庆节 ...

  4. Angular应用里的Template Reference变量

    Angular应用里的Template Reference Variable,模板引用变量,用于创建一个对模板里DOM元素或者Angular指令的引用. 使用#号定义一个模板引用变量. 看个具体的例子 ...

  5. Angular应用里HTTP请求的错误处理

    在需要进行错误处理的Angular应用里,从rxjs里导入catchError: import { catchError, map, tap } from 'rxjs/operators'; getH ...

  6. 【译】开发大型 Angular 应用的12条架构清单

    原文链接:12 Things to Help Large Organizations Do Angular Right 在 Nrwl,我们帮助财富500强公司用正确的方式使用 Angular 平台开发 ...

  7. @angular/core里的 NgZone -使得Angular不跟踪变化

    前言: 在模板中实时获取一个变量,模板中就频繁的更新显示,频繁的变动将造成性能损耗. 或者在双向绑定时,异步事件的发生会导致组件中的数据变化,但是你想要适当时机再改变模板显示. 一.NgZone An ...

  8. Angular 应用里的 vendor.js 是用来干什么的?

    What is vendor file in angular? 以 SAP 电商云 UI 的 Angular 页面为例,这个 vendor.js 有超过 17 万行代码: 此文件包含导入您的应用程序 ...

  9. 关于 Angular 项目里的 index.ts

    如下图所示:如果我需要在文件夹 A 里的某文件,访问文件夹 B 里的某服务,而文件夹 A 和 B 分别是两个不同 module 的实现,我需要在文件夹 A 的文件里,通过导入文件夹 B 里定义的 in ...

最新文章

  1. You are my brother
  2. 著名物理学家斯蒂芬•霍金去世,他曾告诫人类要学会避免人工智能可能的风险
  3. python3 pip3 install 报错 ReadTimeoutError: HTTPSConnectionPool(host=‘xxx‘, port=443): Read timed 解决方法
  4. Keil MDK在个别电脑上下载程序失败的解决办法
  5. lodash 核心源码学习(基于4.17.11版本)
  6. python运算符的分类_python对象——标准类型运算符
  7. 使用axis1.4生成webservice的客户端代码
  8. 只有一个显示器但是显示两个显示器_小米34寸曲面显示器深度体验 办公体验极佳 但是还有个大弱点...
  9. (四)ElasticSearch之数据
  10. SharePoint 2013的REST编程基础
  11. IOS学习之多线程(2)--创建线程
  12. 2_数据分析—认识pandas
  13. SAP License:HANA在线日志被误删后如何恢复?
  14. Android音视频开发(一)音视频基础知识
  15. 基于PLC和组态软件的多方式运行小车控制系统设计
  16. win10 网卡驱动消失
  17. linux rm 文件找回_Linux下用rm删除的文件的恢复方法
  18. 黑桃符号java怎么打印出来_eclipse强转无法输出ASCII码为3的字符(黑桃)?Intellij IDEA用Swing开发...
  19. Flash Magic使用
  20. 如何搭建Telegram群机器人

热门文章

  1. ORACLE IMP-00017: following statement failed with ORACLE error 6550
  2. java中int转成String位数不足前面补零
  3. Webbots、Spiders和Screen Scrapers:技术解析与应用实践(原书第2版)
  4. 抵御物联网DDoS军团
  5. nginx反向代理缓存服务器构建
  6. mariadb集群初次启动方法
  7. [李景山php]每天TP5-20170111|thinkphp5-Model.php-4
  8. 从零写一个编译器(十二):代码生成之生成逻辑
  9. 前端面试题集锦(一)之HTML部分
  10. BZOJ2535 [Noi2010]Plane 航空管制 【贪心 + 堆】