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 相关文章推荐
JS判断移动端访问设备并加载对应CSS样式
Jun 13 Javascript
js中window.open打开一个新的页面
Aug 10 Javascript
jQuery实现拖动调整表格单元格大小的代码实例
Jan 13 Javascript
javascript 闭包详解
Jul 02 Javascript
JS采用绝对定位实现回到顶部效果完整实例
Jun 20 Javascript
Node.js和Express简单入门介绍
Mar 24 Javascript
微信小程序 图片上传实例详解
May 05 Javascript
基于JavaScript实现前端数据多条件筛选功能
Aug 19 Javascript
webpack vue 项目打包生成的文件,资源文件报404问题的修复方法(总结篇)
Jan 09 Javascript
Vue 实现列表动态添加和删除的两种方法小结
Sep 07 Javascript
angular 表单验证器验证的同时限制输入的实现
Apr 11 Javascript
JS原生瀑布流效果实现
Apr 26 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中用PDO查询Mysql来避免SQL注入风险的方法
2013/04/25 PHP
基于php冒泡排序算法的深入理解
2013/06/09 PHP
PHP连接MySQL数据的操作要点
2015/03/20 PHP
Yii2 如何在modules中添加验证码的方法
2017/06/19 PHP
Javascript !!的作用
2008/12/04 Javascript
javascript取消文本选定的实现代码
2010/11/14 Javascript
ASP.NET jQuery 实例13 原创jQuery文本框字符限制插件-TextArea Counter
2012/02/03 Javascript
js将json格式内容转换成对象的方法
2013/11/01 Javascript
百度移动版的url编码解码示例
2014/04/29 Javascript
JavaScript实现将数组中所有元素连接成一个字符串的方法
2015/04/06 Javascript
javascript实现的网站访问量统计代码
2015/12/20 Javascript
浅谈JQuery+ajax+jsonp 跨域访问
2016/06/25 Javascript
AngularJS 指令详细介绍
2016/07/27 Javascript
js实现固定宽高滑动轮播图效果
2017/01/13 Javascript
JavaScript基于面向对象实现的猜拳游戏
2018/01/03 Javascript
微信小程序将字符串生成二维码图片的操作方法
2018/07/17 Javascript
JS函数内部属性之arguments和this实例解析
2018/10/07 Javascript
详解js加减乘除精确计算
2019/03/19 Javascript
javascript设计模式之迭代器模式
2020/01/30 Javascript
JS实现购物车基本功能
2020/11/08 Javascript
python实现flappy bird游戏
2018/12/24 Python
python使用wxpy轻松实现微信防撤回的方法
2019/02/21 Python
安装多个版本的TensorFlow的方法步骤
2020/04/21 Python
python绘图pyecharts+pandas的使用详解
2020/12/13 Python
Html5 滚动穿透的方法
2019/05/13 HTML / CSS
当当网软件测试笔试题
2015/11/24 面试题
职业生涯规划书范文
2014/03/10 职场文书
2014年教师教学工作总结
2014/11/08 职场文书
初婚初育证明范本
2014/11/24 职场文书
2015年党员个人剖析材料
2014/12/18 职场文书
酒店辞职信怎么写
2015/02/27 职场文书
2015年度工程师评职称工作总结
2015/10/14 职场文书
2016年心理学教育培训学习心得体会
2016/01/12 职场文书
写给消防战士们的一封慰问信
2019/10/07 职场文书
Redis+AOP+自定义注解实现限流
2022/06/28 Redis
JS前端使用canvas实现物体的点选示例
2022/08/05 Javascript