2017-02-15 18 views
2

角を使用する1.5角型バリデータの評価順序を制御するにはどうすればよいですか?

私は、ディレクティブが起動されたときに角型バリデーターがフィールドに追加されることを理解しています。私は量フィールドの3つの異なるバリデーションを持っています(正しい文字、最大の長さ、ゼロにすることはできません)。フィールドが有効な金額ではない場合は0と評価する必要はありませんが、有効な金額のチェックを2回目に通過する代わりに、確認したい場合はcontrol.$validator.amountFormat.

保証がありますか私が構築したフォーマットバリデータは、0より大きいバリデータの前に発生します。私はこれ以外の多くのシナリオを持っています。

これは私が持っているものです。

ctrl.$validators.amountFormat = (modelValue: string, viewValue: string) => { 
    if (ctrl.$isEmpty(viewValue)) { 
     return true; 
    } 

    return isAmount(viewValue); 
} 

ctrl.$validators.amountGreaterThanZero = (modelValue: string, viewValue: string) => { 
    if (!isAmount(viewValue)) { //isAmount() is the function used to determine format 
     return true; 
    } 

    return parseFloat(viewValue) > 0; 
} 

これは私が持っているしたいものです。

ctrl.$validators.amountGreaterThanZero = (modelValue: string, viewValue: string) => { 
    if (ctrl.$error.amountFormat) { 
     return true; 
    } 

    return parseFloat(viewValue) > 0; 
} 

答えて

2

次のリンクは$が正常に完了$パーサ後に火をバリデータと説明しています。 Meet the $validators pipelineセクションで:

https://blog.thoughtram.io/angularjs/2015/01/11/exploring-angular-1.3-validators-pipeline.html

ので、代わりの互いの前に発射するバリデータを取得しようとしています。私は、ユーザーが有効な金額を入力してmodelValueに格納していれば(単純に言えば)パーサーを書くことができました。それ以外の場合はmodelValueを空白のままにしました。

ctrl.$parsers.push((viewValue: string) => { 
    var modelReturnValue = ''; 

    if (ctrl.$isEmpty(viewValue)) { return modelReturnValue; } 

    if (this.isAmount(viewValue)) { 
     modelReturnValue = viewValue; 
    } 

    return modelReturnValue; 
}); 

その後、私のバリデータではなく、viewValueを使用して、私はmodelValue

ctrl.$validators.amountFormat = (modelValue: string, viewValue: string) => { 
    if (ctrl.$isEmpty(viewValue)) { 
     return true; 
    } 

    //format validator still has to check the viewValue because if the user doesnt type anything in we do not want to show a format error 
    return isAmount(viewValue); 
} 

を使用することができますviewValue != modelValue場合viewValueは、我々は単にそれを格納している有効な量であるかのため、必要に応じて、amountFormatバリデータは、単純にチェックすることができますmodelValue

ctrl.$validators.amountGreaterThanZero = (modelValue: string) => { 
    //Because we are returning an empty string if the value is not a valid amount, we can comfortably say that the modelValue will be empty 
    if (ctrl.$isEmpty(modelValue)) { 
     return true; 
    } 

    return parseFloat(modelValue) > 0; 
} 
関連する問題