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

Angularjs получают форму поля поля внутри директивы

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

У меня есть директива Angular, таким образом:

app.directive('emailInput', function(){
    return {
        restrict: 'E',
        templateUrl: 'template.html',
        link: function(scope, elem, attrs, ctrl){
            elem.bind('keyup', function(){
                // TODO - what?
            })
        }
    }
}

и в шаблоне html:

<input type="email" required ng-model="emailAddress" />

Не зная имя формы, внутри функции link, я хочу знать значение свойства emailAddress.$valid - как я могу это получить?

4b9b3361

Ответ 1

Вам может потребоваться formController, который предоставит вам доступ ко всем входам, зарегистрированным в форме

app.directive('emailInput', function(){
  return {
      require: '^form', // We look for it on a parent, since it will be defined somewhere higher on the DOM.
      restrict: 'E',
      templateUrl: 'template.html',
      link: function(scope, elem, attrs, ctrl){
          elem.bind('keyup', function(){
              ctrl.emailAddress.$valid //check validity
          })
      }
  }
}

Помните, что Angular отслеживает входные элементы по имени. Поэтому вам нужно указать свой атрибут имени

<input type="email" required ng-model="emailAddress" name="emailAddress" />

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

inputIsValid='formName.emailAddress.$valid'

И оцените (или $watch it) в вашей директиве.

Ответ 2

Мы можем проверить достоверность более легко, не зная названия элементов ввода.

app.directive('emailInput', function(){
  return {
      require: '^form', // We look for it on a parent, since it will be defined somewhere higher on the DOM.
      restrict: 'E',
      templateUrl: 'template.html',
      link: function(scope, elem, attrs, ctrl){
          elem.bind('keyup', function(){
              ctrl.$valid //check validity here
          })
      }
  }
}

Ответ 3

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

Вам просто нужно потребовать контроллер ngModel:

app.directive('emailInput', function(){
  return {
    require: 'ngModel'
    restrict: 'E',
    templateUrl: 'template.html',
    link: function(scope, elem, attrs, ngModelCtrl){
      elem.bind('keyup', function(){
          ngModelCtrl.$valid //check validity
      })
    }
  }
}

См. документ AngularJS для ngModel.NgModelController, $valid в разделе "Свойства":

https://docs.angularjs.org/api/ng/type/ngModel.NgModelController

Ответ 4

Знай это старый поток, но если кто-то столкнется с этой проблемой, я решил это:

app.directive('emailInput', function(){
  return {
      restrict: 'E',
      templateUrl: 'template.html',
      controller:function($scope){
         $scope.isInvalid = function(){
            return $scope.myelem.data().$ngModelController.$invalid;
         }
      },
      link: function(scope, elem, attrs){
          $scope.myelem = $(elem).find("input");
      }
  }
}

Ответ 5

Вот директива, которая установит грязную истину, даже если ничего не было введено.

По умолчанию $dirty устанавливается, если что-то введено и не будет отображать требуемое сообщение об ошибке до тех пор, пока пользователь не отправит. С этим

function() {
    return function (scope, element, attrs) {
        $(element).blur(function () {
            scope.$apply(function() {
                var field = scope.$eval(attrs.makeDirty);
                field.$dirty = true;
            });
        });
    };

HTML:

<label class="fieldLabel" for="confirmEmail">Confirm Email*</label>
<input type="text" id="confirmEmail" name="confirmEmail" ng-model="confirmEmail" ng-pattern="{{Ctrl.Model.Email.EmailAddress}}" required make-dirty="form.confirmEmail">
<span class="error" ng-show="form.confirmEmail.$error.pattern && form.confirmEmail.$dirty">Emails must match</span>
<span class="error" ng-show="form.confirmEmail.$error.required && (form.$submitted || form.confirmEmail.$dirty)">Confirm your email</span>

Это позволяет мне давать обратную связь, когда пользователь заполняет или вносит вклад в форму.

Ответ 6

Позвольте мне дать вам другой способ сделать это, это может быть полезно в некоторых случаях

link: function (scope, element, attrs, formCtrl) {
    scope.fileSizeError=false;
    scope.$watch(function () {
               return formCtrl.fileP.$error.maxSize;
             },function(newValue) {
                scope.fileSizeError=newValue;
             });          
}

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