31

1 つのフィールドが変更されたときに適切に呼び出されるカスタム検証ディレクティブがあります。ただし、このフィールドが有効かどうかは、別のフィールドの値にも基づいています。この 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 を初めて使用する場合は、パート 1パート 2の 2 つの記事を読むことを強くお勧めします。AngularJS フォームの概要です。

4

5 に答える 5

3

同様の問題がありました.タイムアウトが間隔の半分を超えてはならないという条件で、2つのフォームフィールド「間隔」($scope.monitor.intervalの場合)と「タイムアウト」($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);
        }
    });
}

「if」がないと、ダイアログの初期化中にタイムアウト値が削除されました。

于 2013-07-20T16:23:31.743 に答える