首页 > 其他分享 >关于 Angular 应用里 Rxjs filter 操作符内的双重感叹号的用法

关于 Angular 应用里 Rxjs filter 操作符内的双重感叹号的用法

时间:2023-09-14 10:15:40浏览次数:28  
标签:Observable costCenters filter 操作符 CostCenter Rxjs 感叹号 Angular

看下列这段出现在 Angular Component 内的代码:

protected userCostCenters$: Observable<CostCenter[]> =
    this.userCostCenterService
      .getActiveCostCenters()
      .pipe(filter((costCenters) => !!costCenters));

这段Angular组件代码涉及到Observable和RxJS操作符,特别是filter操作符,以及双重感叹号(!!)的用法。我将逐步解释这段代码的含义,并提供示例以更好地理解它。

1. Observable 和 RxJS

在Angular应用中,Observable是RxJS库的一部分,用于处理异步数据流。Observable表示一系列的值,可以随时间发生变化。通常,我们会对Observable应用各种操作符来过滤、转换和操作这些值。

2. Observable<CostCenter[]>

这里,userCostCenters$是一个Observable类型的变量,它表示一个CostCenter数组(CostCenter[])。这意味着它将发出一个CostCenter数组或者为空。

3. .pipe()

pipe()是Observable的方法,用于将操作符串联在一起,以便按顺序应用它们。在这个代码片段中,我们将使用filter操作符来过滤Observable发出的值。

4. filter((costCenters) => !!costCenters)

这是一个filter操作符的应用,它接受一个回调函数作为参数。这个回调函数的目的是过滤Observable发出的值。让我们分解这个回调函数:

  • (costCenters):这是回调函数的参数,表示Observable发出的值,即CostCenter数组。
  • !!costCenters:这是对costCenters的双重感叹号运算符,它用于将一个值强制转换为布尔值。双重感叹号的作用是将非布尔值转换为布尔值,同时确保不会返回nullundefined。如果costCenters是非空的数组,双重感叹号将返回true,否则返回false

因此,filter((costCenters) => !!costCenters)的作用是过滤掉那些不是有效CostCenter数组的值,只允许那些非空数组通过。

示例

为了更好地理解这段代码,让我们来看一个示例。假设userCostCenterService.getActiveCostCenters()是一个服务方法,用于获取用户的活动成本中心,返回一个Observable。以下是一个示例,演示了如何使用这段代码:

import { Component } from '@angular/core';
import { Observable } from 'rxjs';
import { filter } from 'rxjs/operators';

@Component({
  selector: 'app-cost-center',
  template: `
    <div *ngIf="userCostCenters$ | async as costCenters; else loading">
      <h2>User Cost Centers:</h2>
      <ul>
        <li *ngFor="let costCenter of costCenters">{{ costCenter.name }}</li>
      </ul>
    </div>
    <ng-template #loading>Loading...</ng-template>
  `,
})
export class CostCenterComponent {
  userCostCenters$: Observable<CostCenter[]>;

  constructor(private userCostCenterService: UserCostCenterService) {
    this.userCostCenters$ = this.userCostCenterService
      .getActiveCostCenters()
      .pipe(filter((costCenters) => !!costCenters));
  }
}

在上面的示例中,userCostCenters$是一个Observable,它通过getActiveCostCenters()方法获取用户的活动成本中心。然后,我们使用async管道在模板中订阅Observable,并使用*ngIf指令来根据Observable的值来显示用户的成本中心或加载消息。

filter((costCenters) => !!costCenters)确保只有在userCostCenters$包含有效的CostCenter数组时,用户的成本中心才会显示在模板中。

总结

这段Angular组件代码的目的是获取用户的活动成本中心,并使用filter操作符过滤掉非法值,以确保只有有效的CostCenter数组才会通过Observable发送到模板中。双重感叹号(!!)用于将值强制转换为布尔值,同时排除nullundefined,确保只有非空数组通过过滤。这有助于确保模板只在有有效数据可用时显示内容,提高了应用的可靠性和用户体验。

标签:Observable,costCenters,filter,操作符,CostCenter,Rxjs,感叹号,Angular
From: https://www.cnblogs.com/sap-jerry/p/17701747.html

相关文章

  • GZip Servlet Filter
    AGZipServletFiltercanbeusedtoGZipcompresscontentsenttoabrowserfromaJavawebapplication.Thistextwillexplainhowthatworks,andcontainsaGZipServletFilteryoucanuseinyourownJavawebapplications.Ifyoud......
  • 关于 Angular 的 HostBinding 装饰器
    看这段AngularComponent的代码:@HostBinding('class.hidden')getdisabled(){return!this.isAccountPayment;}@HostBinding('class.hidden')这段代码是Angular中的一个装饰器,用于在组件类中绑定宿主元素(hostelement)的属性。在这个特定的例子中,它用来绑定宿......
  • Logstash中Filter的四大插件(grok、date、mutate、mutiline)
    一、grok1.grok使用文本片段切分的方式来切分日志事件filter{grok{match=>{"message"=>"%{IP:client_id_address}%{WORD:method}%{URIPATHPARAM:request}%{NUMBER:bytes}%{NUMBER:http_response_time}"}}}2.内置正则表达式调用%{SYNTAX:SEMANT......
  • [RxJS] Scheduler
    classObservable{constructor(subscribe){this._subscribe=subscribe;}subscribe(observer){returnthis._subscribe(observer);}staticof(value){returnnewObservable((observer)=>{observer.next(value);obse......
  • [SpringSecurity5.2.2源码分析七]:WebAsyncManagerIntegrationFilter
    1、作用• 是为了接口返回异步对象,然后执行异步任务也能通过SecurityContextHolder获取SecurityContext• 比如说返回值是WebAsyncTask的时候2、WebAsyncManagerIntegrationFilter• 源码很短就是在WebAsyncManager中注册了SecurityContextCallableProcessingInterceptorpublic......
  • Git commit - Angular Convention
    使用Git的开发者会使用gitcommit进行代码提交,也会使用-m提交commitmessage。对于一些个人开发者,也许他们会觉得“这是我个人的项目,不用太在意gitcommitmessage的格式或者规范”。但是对于一个团队或者在开源项目上工作的话,对于commitmessage的质量就会有比较高......
  • [SpringSecurity5.6.2源码分析六]:ChannelProcessingFilter
    1、基础用法• ChannelProcessingFilter是SpringSecurity的第一个过滤器,具体排序规则见FilterComparator,image.png• 主要作用:可限制服务端接受的安全协议,比如说仅支持Https或者Http1.1开启配置类:• 首先我们注册到容器中的WebSecurityConfigurerAdapter是针对于WebSecurity的......
  • 记一次SpringBoot Filter的过滤器被重复执行问题
    记一次SpringBootFilter的过滤器被重复执行问题debug发现过滤器执行两次,后来定位到WebFilter和Component注解导致多次扫描,而这次需要用到WebFilter,所以注掉了Component@Order(0)//@Component@WebFilter(urlPatterns={"/*"})@ConditionalOnProperty(name="color.trace.s......
  • 用 Visual Studio Code 开发 Angular 应用自动生成的 .angular 文件夹
    在Angular开发中,项目根目录下的.angular文件夹是AngularCLI工具的一部分,它包含了一些配置和缓存文件,用于提高开发效率和构建性能。.angular文件夹的作用主要包括:缓存构建信息:.angular文件夹中包含了一些缓存文件,用于存储先前构建的信息,以加速后续的构建过程。这有助于......
  • 关于 fakeAsync 在 Angular 应用单元测试开发领域的使用介绍
    笔者最近三年一直在SAP中国研究院从事SAPCommerceCloud(电商云)这款产品的前端开发。电商云Storefront基于开源项目Spartacus,其Github代码仓库地址可以通过这个链接访问。我最近所在的团队一直在负责Spartacus服务器端渲染(SSR)逻辑的开发,包含渲染引擎(RenderingE......