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 相关文章推荐
任意位置显示html菜单
Feb 01 Javascript
给moz-firefox下添加IE方法和属性
Apr 10 Javascript
原生js实现半透明遮罩层效果具体代码
Jun 06 Javascript
html+js实现动态显示本地时间
Sep 21 Javascript
JavaScript对象学习经验整理
Oct 12 Javascript
JavaScript函数模式详解
Nov 07 Javascript
EasyUI学习之DataGird分页显示数据
Dec 29 Javascript
vue2.X组件学习心得(新手必看篇)
Jul 05 Javascript
vue初始化动画加载的实例
Sep 01 Javascript
vue-router的使用方法及含参数的配置方法
Nov 13 Javascript
小程序文字跑马灯效果
Dec 28 Javascript
基于vue实现图片验证码倒计时60s功能
Dec 10 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
PHP4实际应用经验篇(7)
2006/10/09 PHP
ubuntu10.04配置 nginx+php-fpm模式的详解
2013/06/03 PHP
PHP+jQuery+Ajax实现分页效果 jPaginate插件的应用
2015/10/09 PHP
在PHP中使用FastCGI解析漏洞及修复方案
2015/11/10 PHP
PHP面向对象五大原则之单一职责原则(SRP)详解
2018/04/04 PHP
$.format,jquery.format 使用说明
2011/07/13 Javascript
javascript动态添加样式(行内式/嵌入式/外链式等规则)
2013/06/24 Javascript
Js制作简单弹出层DIV在页面居中 中间显示遮罩的具体方法
2013/08/08 Javascript
jquery $.each() 使用小探
2013/08/23 Javascript
HTML页面弹出居中可拖拽的自定义窗口层
2014/05/07 Javascript
jQuery 中DOM 操作详解
2015/01/13 Javascript
在JavaScript应用中实现延迟加载的方法
2015/06/25 Javascript
vue下拉列表功能实例代码
2018/04/08 Javascript
在微信小程序中保存网络图片
2019/02/12 Javascript
JavaScript RegExp 对象用法详解
2019/09/24 Javascript
如何实现echarts markline标签名显示自己想要的
2020/07/20 Javascript
uni-app使用countdown插件实现倒计时
2020/11/01 Javascript
[01:39:04]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第二场 2月1日
2021/03/11 DOTA
python django事务transaction源码分析详解
2017/03/17 Python
python装饰器深入学习
2018/04/06 Python
python用for循环求和的方法总结
2019/07/08 Python
什么是python的自省
2020/06/21 Python
Python并发爬虫常用实现方法解析
2020/11/19 Python
python基于win32api实现键盘输入
2020/12/09 Python
CSS3轻松实现圆角效果
2017/11/09 HTML / CSS
详解HTML5布局和HTML5标签
2020/10/26 HTML / CSS
资生堂美国官网:Shiseido美国
2016/09/02 全球购物
Kipling澳洲官网:购买凯浦林包包
2020/12/17 全球购物
Linux文件系统类型
2012/09/16 面试题
学校爱国卫生月活动总结
2014/06/25 职场文书
拒绝黄毒毒宣传标语
2014/06/26 职场文书
战略合作意向书
2014/07/29 职场文书
"9.18"国耻日演讲稿范文
2014/09/14 职场文书
2016大学军训通讯稿
2015/11/25 职场文书
旅游安全责任协议书
2016/03/22 职场文书
浅析Python中的随机采样和概率分布
2021/12/06 Python