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 相关文章推荐
怎么让脚本或里面的函数在所有图片都载入完毕的时候执行
Oct 17 Javascript
转义字符(\)对JavaScript中JSON.parse的影响概述
Jul 17 Javascript
jQuery如何取id有.的值一般的方法是取不到的
Apr 18 Javascript
jQuery使用$获取对象后检查该对象是否存在的实现方法
Sep 04 Javascript
vue2.0父子组件间通信的实现方法
Apr 19 Javascript
javascript回调函数详解
Feb 06 Javascript
vue操作下拉选择器获取选择的数据的id方法
Aug 24 Javascript
JavaScript实现无限级递归树的示例代码
Mar 29 Javascript
微信小程序实现跳转的几种方式总结(推荐)
Apr 24 Javascript
Node.js实现一个HTTP服务器的方法示例
May 13 Javascript
node将geojson转shp返回给前端的实现方法
May 29 Javascript
微信小程序移动拖拽视图-movable-view实例详解
Aug 17 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入门学习知识点六 PHP文件的读写操作代码
2011/07/14 PHP
PHP mcrypt可逆加密算法分析
2011/07/19 PHP
PHP安全防范技巧分享
2011/11/03 PHP
php版微信公众平台接口参数调试实现判断用户行为的方法
2016/09/23 PHP
Docker搭建自己的PHP开发环境
2018/02/24 PHP
PHP Include文件实例讲解
2019/02/15 PHP
通过javascript的匿名函数来分析几段简单有趣的代码
2010/06/29 Javascript
JavaScript类型转换方法及需要注意的问题小结(挺全面)
2010/11/11 Javascript
原生javascript获取元素样式属性值的方法
2010/12/25 Javascript
js操作textarea 常用方法总结
2012/12/03 Javascript
jQuery学习笔记之 Ajax操作篇(三) - 过程处理
2014/06/23 Javascript
JavaScript中的6种运算符总结
2014/10/16 Javascript
详解JavaScript中循环控制语句的用法
2015/06/03 Javascript
javascript单例模式的简单实现方法
2015/07/25 Javascript
Kindeditor在线文本编辑器如何过滤HTML
2016/04/14 Javascript
BootStrap智能表单demo示例详解
2016/06/13 Javascript
全面介绍javascript实用技巧及单竖杠
2016/07/18 Javascript
jQuery实现级联下拉框实战(5)
2017/02/08 Javascript
Nodejs读取文件时相对路径的正确写法(使用fs模块)
2017/04/27 NodeJs
vue2 全局变量的设置方法
2018/03/09 Javascript
js 计算图片内点个数的示例代码
2019/04/04 Javascript
JavaScript 截取字符串代码实例
2019/09/05 Javascript
Vue使用axios引起的后台session不同操作
2020/08/14 Javascript
[02:19]2014DOTA2国际邀请赛 专访820少年们一起去追梦吧
2014/07/14 DOTA
flask入门之文件上传与邮件发送示例
2018/07/18 Python
Python判断有效的数独算法示例
2019/02/23 Python
python 日期排序的实例代码
2019/07/11 Python
cProfile Python性能分析工具使用详解
2019/07/22 Python
Pytest参数化parametrize使用代码实例
2020/02/22 Python
selenium+python配置chrome浏览器的选项的实现
2020/03/18 Python
python自动化发送邮件实例讲解
2021/01/04 Python
全球最大化妆品零售网站:SkinStore
2020/10/24 全球购物
教师个人剖析材料
2014/02/05 职场文书
2015年大学元旦晚会活动策划书
2014/12/09 职场文书
综合实践活动报告
2015/02/05 职场文书
生死抉择观后感
2015/06/09 职场文书