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 相关文章推荐
JavaScript中的alert()函数使用技巧详解
Dec 29 Javascript
JS+CSS实现闪烁字体效果代码
Apr 05 Javascript
分享jQuery网页元素拖拽插件
Dec 01 Javascript
第一次接触神奇的Bootstrap导航条
Aug 09 Javascript
基于jQuery实现发送短信验证码后的倒计时功能(无视页面关闭)
Sep 02 Javascript
使用AngularJS2中的指令实现按钮的切换效果
Mar 27 Javascript
jQuery中库的引用方法
Jan 06 jQuery
Vuex 在Vue 组件中获得Vuex 状态state的方法
Aug 27 Javascript
vue element中axios下载文件(后端Python)
May 10 Javascript
微信小程序实现元素渐入渐出动画效果封装方法
May 18 Javascript
d3.js 地铁轨道交通项目实战
Nov 27 Javascript
jQuery实现鼠标移入显示蒙版效果
Jan 11 jQuery
微信小程序实现跑马灯效果完整代码(附效果图)
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 Pear 安装及使用
2009/03/19 PHP
php文件操作相关类实例
2015/06/18 PHP
PHP使用fopen与file_get_contents读取文件实例分享
2016/03/04 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
2018/02/07 PHP
PHP常见的几种攻击方式实例小结
2019/04/29 PHP
JavaScript delete操作符应用实例
2009/01/13 Javascript
JavaScript mapreduce工作原理简析
2012/11/25 Javascript
javascript中怎么做对象的类型判断
2013/11/11 Javascript
JS+CSS实现Div弹出窗口同时背景变暗的方法
2015/03/04 Javascript
javascript实现支持移动设备画廊
2015/08/24 Javascript
jQuery改变form表单的action,并进行提交的实现代码
2016/05/25 Javascript
原生JS实现隐藏显示图片 JS实现点击切换图片效果
2021/01/27 Javascript
原生JS写Ajax的请求函数功能
2017/12/22 Javascript
详解如何webpack使用DllPlugin
2018/09/30 Javascript
js实现移动端图片滑块验证功能
2020/09/29 Javascript
python实现多线程的两种方式
2016/05/22 Python
对Pandas DataFrame缺失值的查找与填充示例讲解
2018/11/06 Python
对python中数据集划分函数StratifiedShuffleSplit的使用详解
2018/12/11 Python
pandas 把数据写入txt文件每行固定写入一定数量的值方法
2018/12/28 Python
Python生命游戏实现原理及过程解析(附源代码)
2019/08/01 Python
Python实现word2Vec model过程解析
2019/12/16 Python
pytorch 准备、训练和测试自己的图片数据的方法
2020/01/10 Python
python复合条件下的字典排序
2020/12/18 Python
python 实现逻辑回归
2020/12/30 Python
html5 Canvas画图教程(4)—未闭合的路径及渐变色的填充方法
2013/01/09 HTML / CSS
求职者应聘的自我评价
2013/10/16 职场文书
学生周末长期请假条
2014/02/15 职场文书
《池塘边的叫声》教学反思
2014/04/12 职场文书
活动总结报告格式
2014/05/09 职场文书
教师求职信范文
2014/05/24 职场文书
行政执法队伍作风整顿个人剖析材料
2014/10/11 职场文书
幼儿教师辞职信
2015/02/27 职场文书
2016年禁毒宣传活动总结
2016/04/05 职场文书
mysql优化之query_cache_limit参数说明
2021/07/01 MySQL
Python实现照片卡通化
2021/12/06 Python
java项目构建Gradle的使用教程
2022/03/24 Java/Android