2016-11-23 9 views
4

urlaliasが利用可能かどうかを確認するためにWeb APIを呼び出しています。このタスクでは、私の非同期バリデーターでhttpserviceを使用しています。 バリデータが呼び出されると、正しいコードパスがすべて実行されます(すべてconsole.log()が実行され、期待どおりに動作します)。約束を返すときにカスタム非同期検証が機能しない

検証からの約束がヌルか{ 'isUrlAliasActivityMainAvailable': true }に戻るかどうかに関係なく、コントローラは常にエラーオブジェクトを次のように表示し、フォーム状態を無効にします。なぜ(bloody hell!)?

私が使用している:角度:2.1.0とrxjsを:5.0.0-beta.12

enter image description here

これは私のformbuilderです:

this.formBuilder.group({ 
//... 
"urlAliasActivityMain":[null,[ ValidatorsZr.isUrlAliasActivityMainAvailableAsyncValidator(this.httpActivityService)]], 
}); 

これは私のバリデータです。

public static isUrlAliasActivityMainAvailableAsyncValidator(httpActivityService: HttpActivityService) { 
     return function (control: FormControl): Promise<any> | Observable<any> { 

      const promise = new Promise<any>(
       (resolve, reject) => { 
        httpActivityService.isUrlAliasActivityMainAvailable(control.value) 
         .subscribe(
         (data: any) => { 
          console.log("isUrlAliasActivityMainAvailableAsyncValidator"); 
          console.log(data); 
          if (data == false) { 
           console.log("data == false"); 
           resolve({ 'isUrlAliasActivityMainAvailable': true }); 
          } 
          else { 
           console.log("data == true"); 
           resolve(null); 
          } 
         }, 

        ) 
       }); 

      return promise; 
     } 
    } 

答えて

14

あなたの非同期バリデータは、同期バリデータの場所にリストされています。誤って評価されています。

[objectValue, synchronous validators, asynchronous validators]

制御(formState:オブジェクト、バリ?:ValidatorFn | ValidatorFn []、 asyncValidator?:AsyncValidatorFn | AsyncValidatorFn []):FormControl は、所与formState、バリで新しいFormControlを構築し、および asyncValidator

formStateは、フォームコントロールのスタンドアロン値または値と無効ステータスの両方を含む オブジェクトのいずれかです。

、それを修正し、適切な配列の場所にあなたのバリデータを移動するには:私のとても恥ずかしい、

this.formBuilder.group({ 
//... 
"urlAliasActivityMain":[null, null, ValidatorsZr.isUrlAliasActivityMainAvailableAsyncValidator(this.httpActivityService)], 
}); 
+1

OMGを!あなたの助けてくれてありがとう、あなたは素晴らしい時間を節約しました! – Luther

+1

私はこの非常事のために約4時間を無駄にしました。 –

+0

これは将来の爆笑を救った、私はそれを置いた場所だったことを知らずに、今一日それと戦っていた –

関連する問題