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 相关文章推荐
window.onload 加载完毕的问题及解决方案(上)
Jul 09 Javascript
JQuery CSS样式控制 学习笔记
Jul 23 Javascript
javaScript年份下拉列表框内容为当前年份及前后50年
May 28 Javascript
window.location的重写及判断location是否被重写
Sep 04 Javascript
微信中一些常用的js方法汇总
Mar 12 Javascript
Bootstrap学习笔记之css样式设计(1)
Jun 07 Javascript
json与jsonp知识小结(推荐)
Aug 16 Javascript
js监听键盘事件的方法_原生和jquery的区别详解
Oct 10 Javascript
Angular2的管道Pipe的使用方法
Nov 07 Javascript
layui关闭弹窗后刷新主页面和当前更改项的例子
Sep 06 Javascript
js实现图片上传到服务器和回显
Jan 19 Javascript
Selenium执行JavaScript脚本的方法示例
Dec 31 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定时执行计划任务的多种方法小结
2011/12/19 PHP
php通过sort()函数给数组排序的方法
2015/03/18 PHP
php封装的smarty类完整实例
2016/10/19 PHP
Joomla框架实现字符串截取的方法示例
2017/07/18 PHP
phpStudy中升级MySQL版本到5.7.17的方法步骤
2017/08/03 PHP
php命令行模式代码实例详解
2021/02/26 PHP
javascript操作文本框readOnly
2007/05/15 Javascript
jquery cookie插件代码类
2009/05/26 Javascript
JQuery+CSS提示框实现思路及代码(纯手工打造)
2013/05/07 Javascript
兼容所有浏览器的js复制插件Zero使用介绍
2014/03/19 Javascript
js生成的验证码的实现与技术分析
2014/09/17 Javascript
jQuery如何获取同一个类标签的所有值(默认无法获取)
2014/09/25 Javascript
jQuery实现带有上下控制按钮的简单多行滚屏效果代码
2015/09/04 Javascript
JS中setTimeout的巧妙用法前端函数节流
2016/03/24 Javascript
详解React 在服务端渲染的实现
2017/11/16 Javascript
详解Vue2 添加对scss的支持
2019/01/02 Javascript
使用原生js编写一个简单的框选功能方法
2019/05/13 Javascript
elementUI select组件value值注意事项详解
2019/05/29 Javascript
Js逆向实现滑动验证码图片还原的示例代码
2020/03/10 Javascript
解决vue 退出动画无效的问题
2020/08/09 Javascript
[40:03]Liquid vs Optic 2018国际邀请赛淘汰赛BO3 第一场 8.21
2018/08/22 DOTA
Python利用带权重随机数解决抽奖和游戏爆装备问题
2016/06/16 Python
python实现TF-IDF算法解析
2018/01/02 Python
python中的colorlog库使用详解
2019/07/05 Python
基于Python+Appium实现京东双十一自动领金币功能
2019/10/31 Python
给Python学习者的文件读写指南(含基础与进阶)
2020/01/29 Python
使用Python打造一款间谍程序的流程分析
2020/02/21 Python
Python实现我的世界小游戏源代码
2021/03/02 Python
River Island美国官网:英国高街时尚品牌
2018/09/04 全球购物
酒吧创业计划书
2014/01/18 职场文书
2014年信息宣传工作总结
2014/12/18 职场文书
结婚堵门保证书
2015/05/08 职场文书
2015年幼儿园保育工作总结
2015/05/12 职场文书
2016幼儿园毕业感言
2015/12/08 职场文书
2016学校先进集体事迹材料
2016/02/29 职场文书
anaconda python3.8安装后降级
2021/06/11 Python