如何将Angular 2/4 Reactive Forms自定义验证Promise片段转换为Observable模式?

时间:2017-09-08 16:52:21

标签: angular typescript promise observable angular-reactive-forms

我发现这个反应式表单自定义验证代码段,只要用户输入 test @ yc emailIsTaken: true formControl的错误对象中在1500ms之后添加emailAddress >

enter image description here

takenEmailAddress(control: FormControl): Promise<any> | Observable<any> {
  const promise = new Promise((resolve, reject) => {
    setTimeout(() => {
      if (control.value === 'test@y.c') {
        resolve({'emailIsTaken': true});
      } else {
        resolve(null);
      }
    }, 1500);
  });

  return promise;
}

我喜欢观察者解决发展和可读性问题的方式。在我读到的时候,好处是巨大的。我怎样才能将这样的东西转换为可观察的模式?

一种Observable模式,只要用户输入 test @ yc emailIsTaken: true添加到emailAddress formControl的errors对象中>

How am i going to add <code>emailIsTaken: true</code> inside errors object?

可观察模式中resolvereject的对应部分是什么?

1 个答案:

答案 0 :(得分:0)

FormControl类有成员ValueChanges和StatusChanges,它们都返回Observables,你可以直接在FormControl上使用它。

这样的事可能有用:

email: FormControl;
emailTaken: bool;

ngOnInit() {

    this.email.valueChanges.subscribe(value => {
        if (value === 'testy@y.c")
            this.emailTaken = true;
        else
            this.emailTaken = false;
        },
        error => //Handle error here
    );
}

这可能不是最好的解决方案,但它可能会给你一个想法。只要FormControl中的值发生变化,就会检查其是否有效。

注意:此示例不会异步工作。

您还可以直接从承诺创建一个observable:

const observable = Observable.fromPromise(takenEmailAddress(control));
observable.subscribe(value => /*Do something to handle the value*/ ,
                     err => /*Handle the error*/