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 相关文章推荐
简单的无缝滚动程序-仅几行代码
May 08 Javascript
File文件控件,选中文件(图片,flash,视频)即立即预览显示
Apr 09 Javascript
js前台分页显示后端JAVA数据响应
Mar 18 Javascript
js控制表单不能输入空格的小例子
Nov 20 Javascript
JavaScript实现简单图片滚动附源码下载
Jun 17 Javascript
jQuery中hide()方法用法实例
Dec 24 Javascript
Js为表单动态添加节点内容的方法
Feb 10 Javascript
JavaScript中的setMilliseconds()方法使用详解
Jun 11 Javascript
js+HTML5实现视频截图的方法
Jun 16 Javascript
html+js+highcharts绘制圆饼图表的简单实例
Aug 04 Javascript
写给新手同学的vuex快速上手指北小结
Apr 14 Javascript
react-router-dom 嵌套路由的实现
May 02 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常用字符串操作函数实例总结(trim、nl2br、addcslashes、uudecode、md5等)
2016/01/09 PHP
PHP设计模式之工厂模式实例总结
2017/09/01 PHP
javascript iframe编程相关代码
2009/12/28 Javascript
关于js datetime的那点事
2011/11/15 Javascript
chrome原生方法之数组
2011/11/30 Javascript
IE6背景图片不缓存问题解决方案及图片使用策略多个方法小结
2012/05/14 Javascript
javascript中Date对象的getDay方法使用指南
2014/12/22 Javascript
JS实现具备延时功能的滑动门菜单效果
2015/09/17 Javascript
Angularjs material 实现搜索框功能
2016/03/08 Javascript
JSON字符串转换JSONObject和JSONArray的方法
2016/06/03 Javascript
Web性能优化系列 10个提升JavaScript性能的技巧
2016/09/27 Javascript
浅析Node.js:DNS模块的使用
2016/11/23 Javascript
Vue.js第四天学习笔记
2016/12/02 Javascript
JavaScript中的子窗口与父窗口的互相调用问题
2017/02/08 Javascript
浅谈Angular路由复用策略
2017/10/04 Javascript
简单实现jQuery弹窗效果
2017/10/30 jQuery
vue 运用mock数据的示例代码
2017/11/07 Javascript
vue如何判断dom的class
2018/04/26 Javascript
r.js来合并压缩css文件的示例
2018/04/26 Javascript
基于Three.js实现360度全景图片
2018/12/30 Javascript
javascript实现视频弹幕效果(两个版本)
2019/11/28 Javascript
在vue中嵌入外部网站的实现
2020/11/13 Javascript
[04:42]5分钟带你了解什么是DOTA2(第一期)
2017/02/07 DOTA
python读取浮点数和读取文本文件示例
2014/05/06 Python
Python实现的爬虫功能代码
2017/06/24 Python
Python2.7下安装Scrapy框架步骤教程
2017/12/22 Python
pycharm实现在虚拟环境中引入别人的项目
2020/03/09 Python
html5 Canvas画图教程(3)—canvas出现1像素线条模糊不清的原因
2013/01/09 HTML / CSS
竞选班长演讲稿
2013/12/30 职场文书
餐厅考勤管理制度
2014/01/28 职场文书
公司拓展活动方案
2014/02/13 职场文书
青蓝工程实施方案
2014/03/27 职场文书
教师党的群众路线学习心得体会
2014/11/04 职场文书
2015年国庆节慰问信
2015/03/23 职场文书
Mysql关于数据库是否应该使用外键约束详解说明
2021/10/24 MySQL
java实现面板之间切换功能
2022/06/10 Java/Android