在keychange上执行可观察的请求

时间:2017-07-09 16:58:40

标签: javascript angular

我试图实现从Im检查数据库中是否存在给定的电子邮件,我的目标是检测输入字段中的密钥更改,并在固定延迟执行请求到db之后,努力执行请求,因为我对角度和反应性的。

代码:

checkIfExists(email: string){
    this.emailToSearch.next(email);
  }

emailExists: Observable<boolean>;
  private emailToSearch = new Subject<string>();
  private user = new RegistrationUser(null, null, null, null, null);

  ngOnInit(): void {
    this.emailExists = this.emailToSearch
      .debounceTime(500)
      .distinctUntilChanged()
      .switchMap(
        email => this.registrationService.exists(email));

  }


  <input type="text" class="form-control" name="email" (keyup)="checkIfExists(email.value)" #email="ngModel" required [(ngModel)]="user.email">

1 个答案:

答案 0 :(得分:1)

到目前为止,您的代码似乎还可以。您唯一缺少的是通过调用 ngOnInit(): void { this.emailExists = this.emailToSearch .debounceTime(500) .distinctUntilChanged() .switchMap( email => this.registrationService.exists(email)) .subscribe((result) => doSomething(result)); } 方法实际调用订阅:

Observable

有一件事你必须要小心。在您的情况下,如果由于某种原因,您从this.registrationService.exists收到的 ngOnInit(): void { this.emailExists = this.emailToSearch .debounceTime(500) .distinctUntilChanged() .switchMap( email => this.registrationService.exists(email).catch(() => Observable.empty())) .subscribe((result) => doSomething(result)); } 错误,您的搜索将会中断。确保通过执行以下操作来捕获此信息:

.first {
  display: flex;
  align-items: center;
}

空的observable将允许您的订阅保持活动状态。