Angular搜索场景中使用rxjs的操作符处理思路


Posted in Javascript onMay 30, 2018

在有input输入框的搜索/过滤业务中,总会考虑如何减少发起请求频率,尽量使每次的请求都是有效的。节流和防抖是比较常见的做法,这类函数的实现方式也不难,不过终归还是需要自己封装。rxjs提供了各种操作符 , 可以很快捷高效的实现这些功能。

栗子

现在有一个查询场景,可以通过城市、类型、关键字来多维度过滤结果,如下图:

Angular搜索场景中使用rxjs的操作符处理思路

处理思路:

1、通过ngModel将select和input的值绑定到模型中的过滤条件对象

2、监听select输入框的change事件和input输入框的input事件来触发 发送过滤条件的函数

3、创建一个用于发送过滤条件的Subject,再通过操作符来进行防抖动、前后值的对比等处理,订阅此主体,有有效的过滤条件过来时才发送请求,拉取数据。 

值绑定和事件监听:

<select name="city" id="city" [(ngModel)] = "config.cityCode" (change)="filterList()">
   <option [value]="city.value" *ngFor="let city of citylist" >{{city.name}}</option>
  </select>
  <select name="type" id="type" [(ngModel)] = "config.areaType" (change)="filterList()">
   <option value="">全部</option>
   <option value="TRAFFIC">交通</option>
   <option value="TRAVEL">旅游</option>
  </select>
  <input type="text" class="search" id="search" 
    [(ngModel)] = "config.name" 
    (input)="filterList()"
    placeholder="请输入关键字">

这里为什么input不监听change事件呢? type=text类型的input在失焦的时候才会触发change事件,而input事件则只要value变化就会触发(这里没有考虑IE兼容性问题)

处理函数 :

// 用于传递配置项
 public $filter = new Subject<any>();
 // 过滤条件
 public config: FilterConfig = {
 cityCode : '',
 areaType : '',
 name : ''
 };
 ngOnInit() {
 // 监听过滤配置项
 this.$filter.pipe(
  debounceTime(500),
  distinctUntilChanged( (n: FilterConfig , o: FilterConfig): boolean => {
  return n.name === o.name &&
    n.cityCode === o.cityCode &&
    n.areaType === o.areaType;
  })
 ).subscribe( _config => {
  this.getRegionList(_config);
 });
 }
 filterList() {
 // 每次都要发送一个新的对象,否则distinctUntilChanged compare的时候会一直比较同一个对象的值
 this.$filter.next(Object.assign({}, this.config));
 }
 getRegionList (_config) {
 // 发送请求,更新区域数据
 console.log(_config);
 }

需要注意的是,$filter传递过滤条件的时候,一定要发送一个新的对象,否则 distinctUntilChanged 的 compare 函数由于比较的是同一个对象,会一直认为没有变化,导致不会继续传播。因为config对象的value都是string简单类型,所以可以直接用Object.assign,如果value值是对象类型的话,就需要自己撸个简单的深拷贝工具函数了

总结

主要的思路就是通过Subject来发送过滤条件,这样就可以使用rxjs的各种操作符,可以快捷很多。而在比较对象的时候需要自定义distinctUntilChanged 操作符的compare函数,这时需要注意不要传递同一个对象。

总结

以上所述是小编给大家介绍的Angular搜索场景中使用rxjs的操作符处理思路,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
Extjs 几个方法的讨论
Jan 28 Javascript
jquery中ajax学习笔记一
Oct 16 Javascript
jQuery检查事件是否触发的方法
Jun 26 Javascript
js实现tab切换效果实例
Sep 16 Javascript
jQuery多文件异步上传带进度条实例代码
Aug 16 Javascript
JavaScript箭头(arrow)函数详解
Jun 04 Javascript
node.js使用免费的阿里云ip查询获取ip所在地【推荐】
Sep 03 Javascript
webpack 静态资源集中输出的方法示例
Nov 09 Javascript
jQuery+vue.js实现的多选下拉列表功能示例
Jan 15 jQuery
redux.js详解及基本使用
May 24 Javascript
ElementUI Tag组件实现多标签生成的方法示例
Jul 08 Javascript
详解ES6数组方法find()、findIndex()的总结
May 12 Javascript
微信小程序实现跑马灯效果完整代码(附效果图)
May 30 #Javascript
vue通过点击事件读取音频文件的方法
May 30 #Javascript
vue 表单输入格式化中文输入法异常问题
May 30 #Javascript
详解如何使用babel进行es6文件的编译
May 29 #Javascript
基于打包工具Webpack进行项目开发实例
May 29 #Javascript
JavaScript反射与依赖注入实例详解
May 29 #Javascript
使用webpack3.0配置webpack-dev-server教程
May 29 #Javascript
You might like
PHP中数组合并的两种方法及区别介绍
2012/09/14 PHP
php5.5新数组函数array_column使用
2013/07/08 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
2016/02/15 PHP
php实现的统计字数函数定义与使用示例
2017/07/26 PHP
PHP错误提示It is not safe to rely on the system……的解决方法
2019/03/25 PHP
游戏人文件夹程序 ver 3.0
2006/07/14 Javascript
用Javascript 获取页面元素的位置的代码
2009/09/25 Javascript
JavaScript 程序编码规范
2010/11/23 Javascript
IE的有条件注释判定IE版本详解(附实例代码)
2012/01/04 Javascript
js post提交调用方法
2014/02/12 Javascript
php基于redis处理session的方法
2016/03/14 Javascript
javascript中去除数组重复元素的实现方法【实例】
2016/04/12 Javascript
js点击按钮实现水波纹效果代码(CSS3和Canves)
2016/09/15 Javascript
JavaScript高阶函数_动力节点Java学院整理
2017/06/28 Javascript
深入探究AngularJs之$scope对象(作用域)
2017/07/20 Javascript
AngularJS表单验证功能
2017/10/19 Javascript
input type=file 选择图片并且实现预览效果的实例
2017/10/26 Javascript
vue实现打印功能的两种方法
2018/09/07 Javascript
小程序自动化测试的示例代码
2020/08/11 Javascript
[01:33:25]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第一场 1月24日
2021/03/11 DOTA
Python实现读取机器硬件信息的方法示例
2018/06/09 Python
Python3 获取一大段文本之间两个关键字之间的内容方法
2018/10/11 Python
详解利用Python scipy.signal.filtfilt() 实现信号滤波
2019/06/05 Python
Python csv模块使用方法代码实例
2019/08/29 Python
windows 10 设定计划任务自动执行 python 脚本的方法
2019/09/11 Python
PyCharm使用之配置SSH Interpreter的方法步骤
2019/12/26 Python
python Plotly绘图工具的简单使用
2020/03/03 Python
Python利用pip安装tar.gz格式的离线资源包
2020/09/14 Python
Madewell美德威尔美国官网:美国休闲服饰品牌
2016/11/25 全球购物
英国复古服装购物网站:Collectif
2019/10/30 全球购物
德国亚洲食品网上商店:asiafoodland.de
2019/12/28 全球购物
Oracle里面常用的数据字典有哪些
2014/02/14 面试题
求职简历推荐信范文
2013/12/02 职场文书
演讲比赛的活动方案
2014/08/28 职场文书
大学生旷课检讨书1000字
2015/02/19 职场文书
小学信息技术教学反思
2016/02/16 职场文书