根据 RxJS HTTP 请求中的用户输入检查对象数组中的对象是否存在 服务完整的服务列表组件模板

如何解决根据 RxJS HTTP 请求中的用户输入检查对象数组中的对象是否存在 服务完整的服务列表组件模板

通过 RxJS 使用数据/操作流,如果用户输入无效的托架编号,我想返回/传递错误。如果我的代码与用户输入的数字相匹配,我的代码目前将返回一个 bay 对象,但是如果用户输入了一个在我的列表中不存在的无效的 bay 编号,我不知道如何抛出错误海湾

  1. 为了让我在多个组件/页面之间共享数据,我在 BayService 类中完成了大部分工作:
  private baysUrl = 'api/bays';

  bays$ = this.http.get<Bay[]>(this.baysUrl)
    .pipe(
      tap(data => console.log('Bays: ',JSON.stringify(data))),catchError(this.handleError)
    );

  /*--------------------------------------------------------------*/
  // Grab A Single Bay
  private baySelectedSubject = new BehaviorSubject<number>(0);
  baySelectedAction$ = this.baySelectedSubject.asObservable();

  selectedBay$ = combineLatest([
    this.bays$,this.baySelectedAction$
  ])
    .pipe(
      map(([bays,selectedBayNumber]) =>
        bays.find(bay => bay.bayCode === selectedBayNumber)
      ),);

  selectedBayChanged(selectedBayNumber: number): void {
    this.baySelectedSubject.next(selectedBayNumber);
  }
  1. 我通过创建 BehaviorSubject 创建了一个 Action 流。然后我创建了一个方法来将一个值发送到我的 Action 流上。然后,我在 bay.page.ts 中调用此方法,在其中传递输入参数,然后将其发送到我的数据流。
  2. 然后我将我的数据流和我的动作流结合起来,然后返回一个与我的动作流中的值相匹配的单个海湾对象。
  3. 问题:所以,我已经可以将用户输入的值发送到我的 observable 中,并根据数字返回 bay 对象,如下所示:
onSubmit() {
     this.bayDoesNotExistError = false;
      this.bayService.selectedBayChanged(this.bayForm.get('bayStart').value);
      this.navCtrl.navigateForward([`/results/`]);
      this.bayForm.reset();
    }

,但是如何处理无效号码?例如,当用户在输入数字后按下提交按钮时,如何根据我的 observable 检查它是否无效,然后将某些内容返回给我的组件以显示在 UI 上?目前,我在客户端检查用户键入的内容,然后显示错误,但我需要实际检查输入值是否确实存在于我的 Observable 对象中,如果不存在,则返回错误或其他内容返回到我的 bay.page.ts 文件以显示在我的 HTML 中。

对不起,如果我没有很好地解释这一点,因为我正在努力弄清楚如何措辞。

这是我的 BayService: BayService.ts

这是我的 Bay.page.ts:Bay.page.ts

解决方法

我认为最简单的解决方案是为您的响应创建一个包装器。

export interface BaySelectionResponse {
 type: BayResponseType;
 message: string;
 bay: Bay;
}

export enum BayResponseType {
 ERR = "Bay Error",OK = "Success",NOT_IN_LIST = "BAY NOT FOUND IN LIST"
}

通过这种方式,您可以正确地分离职责。

您的服务将根据响应分配状态和消息,您的页面可以决定如何实现显示结果。

使用这种方法,您甚至可以根据您的服务返回的状态,将结果显示分成具有适当模板的自己的组件。

示例

服务

首先,让我们创建一个服务,它的作用是检查我们的遥控器的可用数据:

@Injectable({providedIn: 'root'})
export class ApiLookupService {
}

首先,我们需要一个方法来简单地查询我们的遥控器所有可能的值。我已经使用 rxjs of 函数 see here

对此进行了模拟
  mockNumbersEndpoint() {
    return of([1,3,7,9,13])
  }

其次,我们需要一个方法,该方法将接受来自消费者(即我们的路由组件,将利用我们的服务)的输入,该方法可以根据给定的输入值检查响应。

  checkValidity(input: number): Observable<ValidityResponseModel> {
    // pipe the response from the api,and switch it into a ValidityResponseModel
    return this.mockNumbersEndpoint().pipe(
      switchMap(apiResponse => {
        const validity = {} as ValidityResponseModel;
        // check if the user's input is valid: Exists in response from server
        if (apiResponse.some(number => input == number)) {
          return of(this.createValidityResponse(
            `Your chosen value ${input} is available`,ValidityResponseTypes.SUCCESS,input
          ));
        }
        // if our code reaches this point,it means we did not find the users input
        return of(this.createValidityResponse(
          `Your chosen value ${input} is NOT available`,ValidityResponseTypes.INVALID,input
        ));
      }),// we have now left the level of the 'switch' and are back in the pipe.
      // We include catchError to handle if any error is thrown,such as network issues.
      catchError(error => {
        return of(this.createValidityResponse(
          "Something went wrong with your request",ValidityResponseTypes.ERR,input
        ));
      })
    )
  }

最后,我添加了一个实用函数,它将响应重组为 ValidityResponseType

  createValidityResponse(message: string,responseType: ValidityResponseTypes,response: number): ValidityResponseModel {
    return {
      message,responseType,response
    } as ValidityResponseModel
  }

完整的服务列表

@Injectable({providedIn: 'root'})
export class ApiLookupService {

  mockNumbersEndpoint() {
    return of([1,13])
  }

  checkValidity(input: number): Observable<ValidityResponseModel> {
    return this.mockNumbersEndpoint().pipe(
      switchMap(apiResponse => {
        const validity = {} as ValidityResponseModel;
        if (apiResponse.some(number => input == number)) {
          return of(this.createValidityResponse(
            `Your chosen value ${input} is available`,input
          ));

        }
        return of(this.createValidityResponse(
          `Your chosen value ${input} is NOT available`,catchError(error => {
        return of(this.createValidityResponse(
          "Something went wrong with your request",input
        ));
      })
    )
  }

  createValidityResponse(message: string,response
    } as ValidityResponseModel
  }
  
}

使用服务的组件

由于在最初的问题中,您在用户按 Enter 键时执行检查,因此我选择实现一个表单。

组件

@Component({
  templateUrl: './demo.component.html',styleUrls: ['./demo.component.scss']
})

export class DemoComponent implements OnInit {
  group: FormGroup;
  responseType = ValidityResponseTypes;
  validityResponse!: ValidityResponseModel;

  constructor(private fb: FormBuilder,private service: ApiLookupService) {
    this.group = fb.group({
      input: fb.control(0,[Validators.minLength(1)])
    })
  }

  ngOnInit(): void {
  }

  // ngSubmit.
  formSubmittal() {
    let v = this.group.get('input')?.value;
    if (this.group.dirty && this.group.valid) {
      this.group.reset();
      this.checkValidity(v);
    }
  }
  // pipe and take(1) to avoid having to manually unsubscribe.
  checkValidity(num: number) {
    this.service.checkValidity(num).pipe(take(1)).subscribe(responseFromApi => {
      // logic based on response here
      this.validityResponse = responseFromApi;
    })
  }
}

模板

<h2>demonstration</h2>

<div class="method">
  <!-- ngSubmit will capture the Enter key event. -->
  <form [formGroup]="group" (ngSubmit)="formSubmittal()">
    <input type="number" formControlName="input">
  </form>
</div>

<div class="result" [ngClass]="{'success': validityResponse?.responseType == responseType.SUCCESS,'invalid': validityResponse?.responseType == responseType.INVALID}">
  {{validityResponse?.message}}
</div>

一旦我们得到服务的响应,我们就会根据响应类型设置样式,并在服务中显示为我们准备的消息。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res