2017-08-30 14 views
0

私はしばらくの間グーグルで行っており、私の特定のケースでは良い答えが見つからないようです。リアルタイム検証を行う方法を見つけましたが、ユーザーが「送信」をクリックした後、カスタム検証と組み合わせる必要があります。私はまだ有効ではないにもかかわらず、ユーザーが依頼をクリックできるようにしたいが、コード内の投稿をキャンセルする。次のコードを取る:AngularJS - フォーム送信時に余分な検証を実行

<form name="cashForm" id="cashForm" novalidate> 
    <input type="text" id="name" required /> // 
    <input type="number" placeholder="Tax: " required name="tax" id="tax" /> 
    <input type="number" placeholder="Tip: " required name="tip" id="tip" /> 
    <button ng-click="submission()" ng-disabled="paymentForm.$invalid">Submit</button> 
</form> 


//inside controller 
this.submission = function() { 
    //check if tip + tax is over 20 
    //prevent form and show error message if not 
    //otherwise allow default behavior 
} 

だから私は唯一税/先端が、私はこれをチェックしないと、それは満たしていない場合どのように私は、フォームの送信を防ぐにはどうすればよい10以上である場合、フォームが実際に提出したいです要求事項?また、私はコントローラにこのロジックを入れますか?

答えて

1

これは、あなたが私に後にしているものにかなり近いようです。

<form name="cashForm" id="cashForm" novalidate> 
    <input id="name" name="name" type="text" ng-model="nameValue" required /> 
    <input id="tax" name="tax" type="number" ng-model="taxValue" placeholder="Tax: " required /> 
    <input id="tip" name="tip" type="number" ng-model="tipValue" placeholder="Tip: " required /> 
    <button 
     ng-click="submission()" 
     ng-disabled="paymentForm.$invalid"> 
     Submit 
    </button> 

を注入:あなたの入力は、あなたがピックアップし、あなたのコントローラで使用できるデータ・バインディングの双方向を作成するために、コントロールに物事のカップル...

ng-modelディレクティブを追加します。

function submission() { 

    $scope.errorMsg = ""; 

    if ($scope.taxValue <= 10) { 
     $scope.errorMsg = "tax not greater than 10"; 
     return; 
    } 

    if ($scope.tipValue <= 10) { 
     $scope.errorMsg = "tip not greater than 10"; 
     return; 
    } 

    // If you reached here your post-click validation passed, 
    // so continue to submit the data... 

} 
:あなたは、コントローラの submission方法でそれら ng-modelバインディングをピックアップすることを可能にするためにあなたのコントローラに $scopeあなたは、知覚の弊害について読みたいかもしれない、あなたのコントローラで $scopeを使用してひび割れしたら、最後に

<div ng-if="!!errorMessage" class="text-danger"> 
    {{ errorMessage }} 
</div> 

あなたは、エラーメッセージをハイライトするCSSクラスでng-ifディレクティブを使用して、エラーメッセージを表示することができます$scopeを使用して、代わりにcontroller-as構文に切り替えることを検討してください。ジョンパパのブログ記事をチェックしてください。AngularJS's Controller As and the vm Variable

+0

ありがとうマシュー。私はそれが良い点に私を得るべきだと思います。最後の質問の1つは、コントローラーがこのロジックを配置する正しい場所ですか?私はあなたがコントローラにあまりにも多くのロジックを置くべきではないと聞いてきましたが、これが理にかなっている唯一の場所であるようです。 –

+0

個人的には、ビューモデル( '$ scope')にどのエラーメッセージがどのように取り込まれるかを条件が直接決定するので、コントローラーには問題ないと思います。コントローラーをできるだけリーンに保つようにしてください。コントローラーでたくさんのスクロールが必要な場合は不快になります。これは多すぎることを意味します。それが制御不能になった場合は、「指示するかどうかをチェックする」ロジックをカスタムディレクティブに抽象化し、独自のカスタムクリック(サブミット)ビヘイビアを作成してボタンのng-clickを置き換えます。 –

+0

その後、_really_を巧妙にしたい場合は、送信を続行できるかどうかを決定する設定を含むconfigオブジェクトを渡して、カスタムディレクティブを再利用可能にしてみてください。次に、それを再利用し、その動作を比較的容易に複製することができます。時間の投資。 –

関連する問題