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学习笔记之获取当前目录的实现代码
Dec 14 Javascript
优化Node.js Web应用运行速度的10个技巧
Sep 03 Javascript
JS实现title标题栏文字不间断滚动显示效果
Sep 07 Javascript
bootstrap配合Masonry插件实现瀑布式布局
Jan 18 Javascript
javascript 中事件冒泡和事件捕获机制的详解
Sep 01 Javascript
node.js博客项目开发手记
Mar 16 Javascript
webuploader分片上传的实现代码(前后端分离)
Sep 10 Javascript
vue项目前端埋点的实现
Mar 06 Javascript
vue表单中遍历表单操作按钮的显示隐藏示例
Oct 30 Javascript
vue中使用WX-JSSDK的两种方法(推荐)
Jan 18 Javascript
如何在Vue.JS中使用图标组件
Aug 04 Javascript
原生JS封装vue Tab切换效果
Apr 28 Vue.js
微信小程序实现跑马灯效果完整代码(附效果图)
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
discuz加密解密函数使用方法和中文注释
2014/01/21 PHP
Linux安装配置php环境的方法
2016/01/14 PHP
Bootstrap+PHP实现多图上传功能实例详解
2018/04/08 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
Prototype Function对象 学习
2009/07/12 Javascript
关于取不到由location.href提交而来的上级页面地址的解决办法
2009/07/30 Javascript
JavaScript实现俄罗斯方块游戏过程分析及源码分享
2015/03/23 Javascript
初步使用bootstrap快速创建页面
2016/03/03 Javascript
javascript时间排序算法实现活动秒杀倒计时效果
2021/01/28 Javascript
深入理解node exports和module.exports区别
2016/06/01 Javascript
AngularJS入门教程之更多模板详解
2016/08/19 Javascript
深入学习jQuery中的data()
2016/12/22 Javascript
使用Fullpage插件快速开发整屏翻页的页面
2017/09/13 Javascript
原生js实现Flappy Bird小游戏
2018/12/24 Javascript
javascript实现导航栏分页效果
2019/06/27 Javascript
Vue防止白屏添加首屏动画的实例
2019/10/31 Javascript
angular异步验证防抖踩坑实录
2019/12/01 Javascript
浅谈vue中document.getElementById()拿到的是原值的问题
2020/07/26 Javascript
vue项目如何监听localStorage或sessionStorage的变化
2021/01/04 Vue.js
[36:33]Ti4 循环赛第四日 附加赛NEWBEE vs Mouz
2014/07/13 DOTA
Python使用cx_Freeze库生成msi格式安装文件的方法
2018/07/10 Python
python实现推箱子游戏
2020/03/25 Python
python 输出所有大小写字母的方法
2019/01/02 Python
python爬虫 爬取58同城上所有城市的租房信息详解
2019/07/30 Python
Python通过两个dataframe用for循环求笛卡尔积
2020/04/29 Python
如何基于matlab相机标定导出xml文件
2020/11/02 Python
html5 乒乓球(碰撞检测)实例二
2013/07/25 HTML / CSS
Cinque网上商店:德国服装品牌
2019/03/17 全球购物
高中生职业生涯规划书
2014/02/24 职场文书
自我鉴定标准格式
2014/03/19 职场文书
大学社团活动总结
2014/04/26 职场文书
领导批评与自我批评范文
2014/10/16 职场文书
单位租房协议书样本
2014/10/30 职场文书
小学生暑假生活总结
2015/07/13 职场文书
详解Html5项目适配系统深色模式方案总结
2021/04/14 HTML / CSS
详解Flutter和Dart取消Future的三种方法
2022/04/07 Java/Android