Angular 我可以使用主题来创建自定义异步验证器吗?

Angular 我可以使用主题来创建自定义异步验证器吗?,angular,angular-forms,angular-validation,angular-observable,Angular,Angular Forms,Angular Validation,Angular Observable,我有没有可能用一个主题来达到这个目的?目前,我只有一个承诺才能做到这一点。所以我调用了resolve方法,这是正确的 我试图做到以下几点 forbiddenEmail(control: FormControl): Observable<any> { const obs = new Subject(); setTimeout(() => { if (control.value === 'test@test.com') { obs.ne

我有没有可能用一个主题来达到这个目的?目前,我只有一个承诺才能做到这一点。所以我调用了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;
  }

根据文档,您可以通过返回可观察到的数据来实现这一点:

我试图用代码示例来证明它,但它看起来并不像它应该的那样工作


这看起来像是角度问题本身,这里有报道:

你需要完成你的可观测:

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);
}

forbiddenEmail2(控件:FormControl):可观察

绝对可以,只需返回主题并带有
asObservable()

禁止电子邮件(控制:FormControl):可观察{
常量主题=新主题();
设置超时(()=>{
如果(control.value==='test@test.com') {
subject.next({emailIsForbidden:true});
}否则{
subject.next(空);
}
}, 2000);
返回subject.asObservable();
}

非常感谢。有趣的是,第二条路没有走;因为某种原因,我不能为我工作。尽管它在演示中起作用。它又在等待了。但我很高兴我在这个问题上得到了答案。我想问题是,受试者需要取消订阅,这就完成了吗?
forbiddenEmail2(control: FormControl): Observable<any> {
  const result = control.value === 'test@test.com' ? {'emailIsForbidden': true} : null;
  return Observable.of(result).delay(2000);
}
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();
}