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中this关键字(翻译+自我理解)
Oct 20 Javascript
JQUBar 基于JQUERY的柱状图插件
Nov 23 Javascript
jQuery的attr与prop使用介绍
Oct 10 Javascript
基于js与flash实现的网站flv视频播放插件代码
Oct 14 Javascript
JavaScript函数详解
Nov 17 Javascript
BootStrap响应式导航条实例介绍
May 06 Javascript
js判断主流浏览器类型和版本号的简单实现代码
May 26 Javascript
详解javascript事件绑定使用方法
Oct 20 Javascript
详解Vue CLI 3.0脚手架如何mock数据
Nov 23 Javascript
通过JavaScript下载文件到本地的方法(单文件)
Mar 17 Javascript
微信小程序之几种常见的弹框提示信息实现详解
Jul 11 Javascript
JavaScript实现淘宝商品图切换效果
Apr 29 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获取ip的三个属性区别介绍(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
2012/09/23 PHP
php使用curl并发减少后端访问时间的方法分析
2016/05/12 PHP
php根据命令行参数生成配置文件详解
2019/03/15 PHP
禁止你的左键复制实用技巧
2013/01/04 Javascript
javascript中的parseInt和parseFloat区别
2013/07/12 Javascript
jquery实现键盘左右翻页特效
2015/04/30 Javascript
基于js实现投票的实例代码
2015/08/04 Javascript
javascript发送短信验证码实现代码
2015/11/12 Javascript
jQuery实现最简单的切换图效果【可兼容IE6、火狐、谷歌、opera等】
2016/09/04 Javascript
Java  Spring 事务回滚详解
2016/10/17 Javascript
react-native 封装选择弹出框示例(试用ios&amp;android)
2017/07/11 Javascript
基于Require.js使用方法(总结)
2017/10/26 Javascript
微信小程序基于slider组件动态修改标签透明度的方法示例
2017/12/04 Javascript
vue 做移动端微信公众号采坑经验记录
2018/04/26 Javascript
JS与CSS3实现图片响应鼠标移动放大效果示例
2018/05/04 Javascript
详解实现一个通用的“划词高亮”在线笔记功能
2019/04/23 Javascript
微信小程序登录对接Django后端实现JWT方式验证登录详解
2019/07/29 Javascript
js实现3D旋转相册
2020/08/02 Javascript
js实现计算器功能
2020/08/10 Javascript
JavaScript实现HTML导航栏下拉菜单
2020/11/25 Javascript
[01:12]快闪回顾DOTA2亚洲邀请赛(DAC) 静候2018新征程开启
2018/03/11 DOTA
[07:06]2018DOTA2国际邀请赛寻真——卫冕冠军Team Liquid
2018/08/10 DOTA
Python脚本实现自动发带图的微博
2016/04/27 Python
flask使用session保存登录状态及拦截未登录请求代码
2018/01/19 Python
Python加载带有注释的Json文件实例
2018/05/23 Python
kali中python版本的切换方法
2019/07/11 Python
python中for循环变量作用域及用法详解
2019/11/05 Python
Python脚本实现Zabbix多行日志监控过程解析
2020/08/26 Python
HTML5 history新特性pushState、replaceState及两者的区别
2015/12/26 HTML / CSS
英国最大的汽车交易网站:Auto Trader UK
2016/09/23 全球购物
乔丹诺(Giordano)酒庄德国官网:找到最好的意大利葡萄酒
2017/12/28 全球购物
五一家具促销方案
2014/01/10 职场文书
报关员个人职业生涯规划书
2014/03/12 职场文书
大队干部竞选演讲稿
2014/04/28 职场文书
入党积极分子批评与自我批评思想汇报
2014/09/14 职场文书
雨雪天气温馨提示
2015/07/15 职场文书