1

件名でこれを達成できる可能性はありますか?当分の間、私はこれをプロミスで達成しただけです。だから私は解決メソッドを呼び出すと、それが正しく動作します。Subjectを使用してカスタム非同期バリデータを作成できますか?

私は以下を実行しようとしていました。

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

    const obs = new Subject(); 
    setTimeout(() => { 
     if (control.value === '[email protected]') { 
     obs.next({'emailIsForbidden': true}); 
     } else { 
     obs.next(null); 
     } 
    }, 2000); 
    return obs; 
    } 

、イム角度でドキュメントがバリデータについての言うように値が[email protected]、そうでない場合はnullであるときはいつでもイベントを放出しようとしています。 私はシミュレートしようとしていますが、バックエンドサービスは、なぜ私はsetTimeout機能を実装し、2秒のタイムアウトを与えることができると言うことができます。 問題は、私がバリデータ(電子メール入力要素)を置くinput要素を調べると、クラスng-pendingが常に表示されることです。 何らかの理由でそれを購読していない私はそれを知っています。しかし、どうすればいい?

これは私がフォームグループ内のバリデーターを呼び出すところです。

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([]) 
    }); 
    } 

答えて

1

setTimeout(() => { 
    if (control.value === '[email protected]') { 
    obs.next({'emailIsForbidden': true}); 
    } else { 
    obs.next(null); 
    } 
    obs.complete(); 
}, 2000); 

しかし、これははるかに簡単な方法で定義することができます:それはバリデータが呼び出された時点であるとして、それは実際に代わり、検証のため、入力を検証するため、

forbiddenEmail2(control: FormControl): Observable<any> { 
    const result = control.value === '[email protected]' ? {'emailIsForbidden': true} : null; 
    return Observable.of(result).delay(2000); 
} 

これは、また、より正確です2秒後に入力します。より現実的なユースケースでは、入力を直ちに取得してバックエンドに送信します。

デモ:http://plnkr.co/edit/qAdl7lTaKzn0bUNOp8fy?p=preview

+0

ありがとうございます。面白いことは、第二の方法didn; t何らかの理由で私のために働くことです。それはデモで動作しますが。それは再び保留に固執します。しかし、私はSubjectでそれを持っています。私は問題はサブジェクトが購読を解除する必要があり、それが完全であることだったと思いますか? – konstantinos

1

文書によると、あなたが観測戻っていることを達成することができます: https://angular.io/api/forms/AsyncValidatorFn

私はコードのサンプルとそれを証明しようとしたが、それが必要として、それが動作しないように見える...

それはここにそれが報告されます、角度の問題そのもののように見える:あなたの観察可能なを完了する必要がhttps://github.com/angular/angular/issues/13200

関連する問題