удалить сообщение об ошибке $ из нескольких полей ввода в форме, используя директиву

0

У меня есть несколько полей в форме:

<input name="participant{{$index}}email" type="email" ng-model="participant.email" ng-trim="true"
                           required ng-minlength="1" ng-maxlength="255"
                           email-uniqueness-validator="{{$index}}">


Я использую директиву emailUniquenessValidator, чтобы проверить, не вступил ли какой-либо участник в тот же адрес электронной почты. Если это так, я показываю сообщение об ошибке:

<div ng-messages="enroll['participant' + $index + 'email'].$error">
    <div ng-message="emailUniqueness">The email addresses must be different for every applicant...</div>
</div>


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

Директива:

.directive('emailUniquenessValidator',
    function() {
        return {
            require : 'ngModel',
            link: function (scope, element, attrs, ngModel) {
                scope.$watch(attrs.ngModel, function () {
                    var currentEmailFieldNo = attrs.emailUniquenessValidator;
                    var diffEmails = differentEmails(scope, currentEmailFieldNo);
                    ngModel.$setValidity('emailUniqueness', diffEmails);
                    if (!diffEmails) {//one field has changed and there is no duplicates, but we need to remove validation errors from the other field
                        cleanDuplicateEmailErrors(scope);
                    }
                });
            }
        }
    });

differentEmails функция:

function differentEmails(scope, currentEmailFieldNo) {
    differentEmails = true;
    var currentEmail = currentEmailFieldNo >= 0
        ? scope.applicantEnrollDto.participants[currentEmailFieldNo].email
        : scope.applicantEnrollDto.email;
    var mainEmail = scope.applicantEnrollDto.email;
    if (currentEmailFieldNo < 0) {
        if (emailInArray(currentEmail, scope.applicantEnrollDto.participants)) {
            differentEmails = false;
        }
    } else {
        var applicantsNo = scope.applicantEnrollDto.participants.length
        var differentEmails = true;
        if (applicantsNo) {
            differentEmails = !hasDuplicates(scope.applicantEnrollDto.participants);
            if (differentEmails) {
                if (currentEmail === mainEmail) {
                    differentEmails = false;
                }
            }
        }
    }
    return differentEmails;
}
  • 0
    что функция делает differentEmails делать? можешь выложить свой код?
  • 0
    Он возвращает истину, если все письма разные, ложь в противном случае. Я добавил свой код.
Теги:
angular-ngmodel
angularjs-directive

1 ответ

0
Лучший ответ

Проблема была решена легко, обратившись к форме в области

$scope.form["participant"+i+"email"].$setValidity('emailUniqueness', errorsOff);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню