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 相关文章推荐
jQuery随机切换图片的小例子
Apr 18 Javascript
使用apply方法实现javascript中的对象继承
Dec 16 Javascript
js 验证身份证信息有效性
Mar 28 Javascript
js调试系列 断点与动态调试[基础篇]
Jun 18 Javascript
Javascript常用字符串判断函数代码分享
Dec 08 Javascript
js中匿名函数的创建与调用方法分析
Dec 19 Javascript
jQuery固定元素插件scrolltofixed使用指南
Apr 21 Javascript
jquery配合.NET实现点击指定绑定数据并且能够一键下载
Oct 28 Javascript
EasyUI Combobox设置默认值 获取text的方法
Nov 28 Javascript
JS实现在文本指定位置插入内容的简单示例
Dec 22 Javascript
详解解决使用axios发送json后台接收不到的问题
Jun 27 Javascript
js实现鼠标切换图片(无定时器)
Jan 27 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/05/22 PHP
php二维数组排序方法(array_multisort usort)
2013/12/25 PHP
php表单提交实例讲解
2015/11/12 PHP
服务器迁移php版本不同可能诱发的问题
2015/12/22 PHP
用php和jQuery来实现“顶”和“踩”的投票功能
2016/10/13 PHP
从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记图文详解
2019/04/03 PHP
jQuery textarea的长度进行验证
2009/05/06 Javascript
Javascript 日期处理之时区问题
2009/10/08 Javascript
FF火狐下获取一个元素同类型的相邻元素实现代码
2012/12/15 Javascript
IE6下opacity与JQuery的奇妙结合
2013/03/01 Javascript
js、css、img等浏览器缓存问题的2种解决方案
2013/10/23 Javascript
javascript新建标签,判断键盘输入,以及判断焦点(示例代码)
2013/11/25 Javascript
jquery实现checkbox 全选/全不选的通用写法
2014/02/22 Javascript
jQuery中triggerHandler()方法用法实例
2015/01/19 Javascript
javascript字符串替换函数如何一次性全部替换掉
2015/10/30 Javascript
JavaScript常用函数工具集:lao-utils
2016/03/01 Javascript
简单了解JavaScript操作XPath的一些基本方法
2016/06/03 Javascript
JQuery手速测试小游戏实现思路详解
2016/09/20 Javascript
微信小程序 教程之事件
2016/10/18 Javascript
JavaScript实现的鼠标响应颜色渐变效果完整实例
2017/02/18 Javascript
JavaScript html5利用FileReader实现上传功能
2020/03/27 Javascript
js时间戳与日期格式之间相互转换
2017/12/11 Javascript
原生JS实现多个小球碰撞反弹效果示例
2018/01/31 Javascript
详解如何在vscode里面调试js和node.js的方法步骤
2018/12/24 Javascript
Python 对象中的数据类型
2017/05/13 Python
python读取文本中数据并转化为DataFrame的实例
2018/04/10 Python
Python UnboundLocalError和NameError错误根源案例解析
2018/10/31 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
2019/01/26 Python
Python面向对象程序设计示例小结
2019/01/30 Python
Python常用数字处理基本操作汇总
2020/09/10 Python
学期自我鉴定
2013/11/04 职场文书
抄作业检讨书
2014/02/17 职场文书
学习全国两会精神心得体会范文
2014/03/17 职场文书
幼儿教师演讲稿
2014/05/06 职场文书
立项申请报告范本
2015/05/15 职场文书
OpenStack虚拟机快照和增量备份实现方法
2022/04/04 Servers