Подтвердить что ты не робот

Проверка триггера поля при изменении другого поля

У меня есть специальная директива проверки, которая правильно называется, когда одно поле изменено. Однако, действительно ли это поле действительно, также основано на другом значении поля. Это второе поле является выбранным списком, если это важно.

Мне было интересно, можно ли каким-то образом инициировать проверку вручную при изменении второй формы. Возможно, используя событие 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 статьи: часть 1 и часть 2. Это обзор форм AngularJS.

4b9b3361

Ответ 1

После многого для этого поиска я обнаружил, что мы можем инициировать проверку просто путем вызова $validate() в нужном поле.
Например, если ваша форма называется my_form (т.е. в разметке тег формы имеет атрибут name="my_form"), а имя поля, которое вы хотите проверить, - это дата (в разметке поле ввода имеет атрибут name="date"), то, как вы предположили, вы можете использовать событие ng-change в поле второй и вызывать $scope.my_form.date.$validate(); всякий раз, когда вызывается функция ng-change.

Ответ 2

У меня была аналогичная проблема: два поля формы "интервал" (для $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);
        }
    });
}

Без "если" значение тайм-аута удалено во время инициализации диалогового окна.

Ответ 3

В итоге я добавил директиву ко второму полю, а затем изменил директиву, чтобы добавить сообщение об ошибке в поле с ошибкой. Возможно, лучший способ, но это то, что я и сделал.

Ответ 4

Мне не удалось получить ng-blur="myForm.myField.$validate()", работающий в AngularJS 1.5, возможно, потому что модель для myField была пуста.

Однако ng-blur="myForm.myField.$setTouched()" действительно работал.