2013-06-18 9 views
24

フィールドが変更されたときに正しく呼び出されるカスタム検証ディレクティブがあります。ただし、このフィールドが有効かどうかは、別のフィールドの値にも基づいています。この第2のフィールドは、それが重要であれば選択リストである。別のフィールドが変更されたときのフィールドのトリガー検証

2番目のフォームが変更されたときに手動で検証をトリガできる方法があるかどうかは疑問でした。おそらくng-changeイベントを使用します。このようなことを処理する適切な方法は何ですか?

は、ここに私のディレクティブです:

angular.module('myApp', []). 
    directive('validage', function() { 
     return { 
      require: 'ngModel', 
      link: function (scope, elem, attr, ngModel) { 

       function validate(value) { 
        var valid = true; 
        if ((GetDateDifference(new Date(value), new Date()) < 16 || GetDateDifference(new Date(value), new Date()) > 129) 
        && scope.dep.DependantType == "Spouse") { 
         valid = false; 
        } 
        ngModel.$setValidity('validage', valid); 
        return value; 
       } 

       //For DOM -> model validation 
       ngModel.$parsers.unshift(function (value) { 
        var valid = true; 
        if ((GetDateDifference(new Date(value), new Date()) < 16 || GetDateDifference(new Date(value), new Date()) > 129) 
        && scope.dep.DependantType == "Spouse") { 
         valid = false; 
        } 
        ngModel.$setValidity('validage', valid); 
        return value; 
       }); 

       //For model -> DOM validation 
       ngModel.$formatters.unshift(function (value) { 
        var valid = true; 
        if ((GetDateDifference(new Date(value), new Date()) < 16 || GetDateDifference(new Date(value), new Date()) > 129) 
        && scope.dep.DependantType == "Spouse") { 
         valid = false; 
        } 
        ngModel.$setValidity('validage', valid); 
        return value; 
       }); 
      } 
     }; 
    }); 

あなたはAngularJSに新しいしている場合、私は間違いなく、これらの2件の記事読んで推薦:part 1 & part 2を。 AngularJSフォームの概要です。

+0

StackOverflowの[この回答](http://stackoverflow.com/a/16886177/2057033)を参照してください。 – Blackhole

+0

と角度1.3を使用すると、ngModel。$ validate(); –

+2

anglular 1.2では、ngModel。$ setViewValue()で$ parserのすべての関数を手動で起動できます。ですから、自分自身に設定してください:ngModel。$ setViewValue(ngModel。$ viewValue) – likesalmon

答えて

0

2番目のフィールドにディレクティブを追加してから、ディレクティブを変更してエラーメッセージをフィールドに追加しました。より良い方法があるかもしれませんが、それが私のやり方です。

3

私は同様の問題を抱えていました:timeoutが間隔の半分を超えてはならないという条件で、2つのフォームフィールド "interval"($ scope.monitor.interval)と "timeout"($ scope.monitor.timeout)

まず、この条件のチェックをタイムアウトするカスタムバリデータを追加しました。インターバルが変わったときにもタイムアウトバリデータをトリガする必要がありました。私は、モデルのmonitor.intervalプロパティを見て、これを達成:

function EditMonitorCtrl($scope, $log, dialog, monitor) { 
    $scope.monitor = monitor; 

    ... 

    // trigger validation of timeout field when interval changes 
    $scope.$watch("monitor.interval", function() { 
     if ($scope.editMonitorDlg.timeout.$viewValue) {   
      $scope.editMonitorDlg.timeout.$setViewValue($scope.editMonitorDlg.timeout.$viewValue); 
     } 
    }); 
} 

タイムアウト値は、ダイアログのintialisation中に除去されてしまった「場合」がなければ。

44

これをたくさん検索したところ、希望のフィールドで$validate()を呼び出すだけで、検証がトリガーされることがわかりました。例えばだから、
フォームがmy_formという(つまりマークアップにformタグがname="my_form"属性を持っている)し、検証するフィールドの名前は日付(マークアップで入力フィールドがname="date"を持っている場合属性)を使用する場合は、イベントの第2のフィールドを使用し、ng-change関数が呼び出されるたびに$scope.my_form.date.$validate();を呼び出すことをお勧めします。

+7

ありがとう!これは、ngModelを呼び出すことによってディレクティブでも機能します。$ validate();例えば、あなたが属性を持っている場合、モデルを再検証することができます: –

+0

これはどのバージョンの角度ですか? 1.2.18を使用していますが、$ validate()関数が表示されません。 –

+1

私はバージョン1.3.2を使用しています。 '$ validate()'はバージョン1.3.0から利用可能です。ちなみに、ngmodelとフィールド名の関係については、https://code.angularjs.org/1.3をご覧ください。0/docs/guide/formsを_Bindingの下に作成し、state_を制御します。 – gneri

0

myFieldのモデルが空だったため、AngularJS 1.5で動作するng-blur="myForm.myField.$validate()"を取得できませんでした。

ただし、ng-blur="myForm.myField.$setTouched()"が機能しました。

関連する問題