• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Angular搜索场景中使用rxjs的操作符处理思路

angularjs 搞代码 4年前 (2021-12-31) 22次浏览 已收录 0个评论

这篇文章主要介绍了Angular搜索场景中使用rxjs的操作符处理思路,主要的思路就是通过Subject来发送过滤条件,这样就可以使用rxjs的各种操作符,可以快捷很多。需要的朋友可以参考下

在有input输入框的搜索/过滤业务中,总会考虑如何减少发起请求频率,尽量使每次的请求都是有效的。节流和防抖是比较常见的做法,这类函数的实现方式也不难,不过终归还是需要自己封装。rxjs提供了各种操作符 , 可以很快捷高效的实现这些功能。

栗子

  现在有一个查询场景,可以通过城市、类型、关键字来多维度过滤结果,如下图:

  处理思路:

    1、通过ngModel将select和input的值绑定到模型中的过滤条件对象

    2、监听select输入框的change事件和input输入框的input事件来触发 发送过滤条件的函数

    3、创建一个用于发送过滤条件的Subject,再通过操作符来进行防抖动、前后值的对比等处理,订阅此主体,有有效的过滤条件过来时才发送请求,拉取数据。 

  值绑定和事件监听:

  {{city.name}} 全部交通旅游

这里为什么input不监听change事件呢? type=text类型的input在失焦的时候才会触发change事件,而input事件则只要value变化就会触发(这里没有考虑IE兼容性问题)

  处理函数 :

 // 用于传递配置项 public $filter = new Subject(); // 过滤条件 public config: FilterConfig = { cityCode : '', areaType : '', name : '' }; ngOnInit() { // 监听过滤配置项 this.$filter.pipe( debounc<strong style="color:transparent">来源gaodai#ma#com搞@@代~&码网</strong>eTime(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的操作符处理思路的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Angular搜索场景中使用rxjs的操作符处理思路

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址