1

我有没有机会通过一个主题来实现这一目标?暂时我只是通过一个承诺来实现这一点。所以我调用了 resolve 方法,它工作正常。

我试图做以下事情。

forbiddenEmail(control: FormControl): Observable<any> {

    const obs = new Subject();
    setTimeout(() => {
      if (control.value === 'test@test.com') {
        obs.next({'emailIsForbidden': true});
      } else {
        obs.next(null);
      }
    }, 2000);
    return obs;
  }

在这里,我试图在值为 test@test.com 时发出事件,否则为 null,因为 Angular 中的文档说关于验证器。我试图模拟让我们说一个后端服务,这就是我实现 setTimeout 功能并给出 2 秒超时的原因。现在的问题是,当我检查放置验证器(电子邮件输入元素)的输入元素时,ng-pending总是会显示类。所以,出于某种原因,我没有订阅它,我知道。但我怎么能?

这是我在 FormGroup 中调用验证器的地方。

ngOnInit() {
    this.signupForm = new FormGroup({
      'userData': new FormGroup({
        'username': new FormControl(null, [Validators.required, this.forbiddenNames.bind(this)]),
        'email': new FormControl(null, [Validators.required, Validators.email], this.forbiddenEmail.bind(this))
      }),
      'gender': new FormControl('male'),
      'hobbies': new FormArray([])
    });
  }
4

3 回答 3

1

根据文档,您可以通过返回 observable 来实现: https ://angular.io/api/forms/AsyncValidatorFn

我试图用代码示例来证明它,但看起来它不能正常工作......

它看起来像角度问题本身,这里报道:https ://github.com/angular/angular/issues/13200

于 2017-11-12T18:26:13.247 回答
1

你需要完成你的 observable:

setTimeout(() => {
  if (control.value === 'test@test.com') {
    obs.next({'emailIsForbidden': true});
  } else {
    obs.next(null);
  }
  obs.complete();
}, 2000);

但这可以用更简单的方式定义:

forbiddenEmail2(control: FormControl): Observable<any> {
  const result = control.value === 'test@test.com' ? {'emailIsForbidden': true} : null;
  return Observable.of(result).delay(2000);
}

这也更正确,因为它实际上在调用验证器时验证输入,而不是在 2 秒后验证输入。在更现实的用例中:您将立即获得输入,并将其发送到后端。

演示:http ://plnkr.co/edit/qAdl7lTaKzn0bUNOp8fy?p=preview

于 2017-11-12T18:26:23.053 回答
0

当然,只需返回主题asObservable()

forbiddenEmail(control: FormControl): Observable<any> {
  const subject = new Subject();

  setTimeout(() => {
    if (control.value === 'test@test.com') {
      subject.next({ emailIsForbidden: true });
    } else {
      subject.next(null);
    }
  }, 2000);

  return subject.asObservable();
}
于 2019-09-12T23:43:34.467 回答