Убедитесь, что 2 поля угловой формы не имеют одинакового содержимого.

У меня есть угловая форма, состоящая из двух полей местоположения A и местоположения B. Я хотел бы добиться директивы, которая сравнивает оба поля и проверяет их соответствующим образом, соответствующим образом оформляя допустимое или недопустимое поле всякий раз, когда поля имеют одно и то же местоположение.

Я попытался вставить логику, используя ng-change = validateLocations(), но на основе того, что я исследовал, директива лучше подходит для сценариев, подобных приведенным выше. Та же логика также может применяться для проверки дат from и to в средстве выбора даты.

Я пробовал что-то вроде этого:

.directive("locationANotEqual", function () {

        return {

            restrict: "A",
           require: "ngModel",
            link: function (scope, element, attr, ctrl) {

                ctrl.$validators.locationNotEqual= function (modelvalue) {
                    if (modelvalue !== scope.form.locationB) {
                        return true;

                    } else {

                        return false
                    }
                }
}
}
});

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


person lacoder    schedule 15.05.2017    source источник


Ответы (1)


Добавьте еще один параметр в свою директиву и сравните с этим значением вместо scope.form.locationB. Вызовите attributes.$observe для этого значения для изменений, поэтому модель директивы может быть помечена как действующая/недействительная.

data-ng-model-options="{allowInvalid: true}" используется для того, чтобы при совпадении значений модель все еще была установлена.

app.directive('validateNotEqual', [
    function() {
        return {
            restrict: 'AE',
            require: '^ngModel',
            link: function(scope, element, attributes, ngModelCtrl) {
                if (!ngModelCtrl) {
                    return;
                }

                var errorKey = 'notEqual';

                ngModelCtrl.$validators[errorKey] = function(value) {
                    return value !== attributes.validateNotEqual;
                };

                attributes.$observe('validateNotEqual', function(value) {
                    ngModelCtrl.$setValidity(
                        errorKey,
                        value !== ngModelCtrl.$modelValue);
                });
            }
        };
    }
]);

См. планкер.

person kevin    schedule 16.05.2017
comment
Это сработало для меня. Я изменил ngModelCtrl.$validators[errorKey] на ngModelCtrl.$validators.notEqual - person lacoder; 17.05.2017