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

Программировать все поля формы для ng-касания при отправке формы

HTML:

<div class="form-group" 
     ng-class="{ 'has-error' : form.firstName.$invalid && form.firstName.$touched }">
  <label for="firstName" 
         class="control-label">
         First Name
  </label>
  <input type="text" 
         name="firstName" 
         id="firstName" 
         ng-model="editableUser.firstName" 
         class="form-control" 
         required>
  <span class="help-block" 
        ng-show="form.firstName.$error.required && form.firstName.$touched">
        First Name is required
  </span>
</div>

<input type="submit" 
       ng-click="submit()" 
       value="Submit" 
       class="btn btn-default">

Я пытаюсь получить класс "has-error", чтобы использовать недопустимые поля, когда пользователь нажимает кнопку "Отправить".

Я думаю, вы могли бы сделать что-то вроде этого:

$scope.submit = function () {
  if ($scope.form.$invalid) {
    angular.forEach($scope.form.$invalid, function(field) {
      field.$setTouched();
    });
    alert("Form is invalid.");
  }
};

Но в https://docs.angularjs.org/api/ng/type/form.FormController

нет метода $setTouched

EDIT: Realize $setTouched существует, он находится в https://docs.angularjs.org/api/ng/type/ngModel.NgModelController

4b9b3361

Ответ 1

if ($scope.form.$invalid) {
    angular.forEach($scope.form.$error, function (field) {
        angular.forEach(field, function(errorField){
            errorField.$setTouched();
        })
    });
    alert("Form is invalid.");
}

plunker: http://plnkr.co/edit/XmvoTkIQ0yvFukrVSz11

Ответ 2

Попробуйте недавно добавленные $отправленные

<input type="text" 
     name="firstName" 
     id="firstName" 
     ng-model="editableUser.firstName" 
     class="form-control" 
     required>
   <span class="help-block" 
    ng-show="form.firstName.$error.required && (form.firstName.$touched || form.$submitted">
    First Name is required

Ответ 3

Расширение ответа Alexey, вы можете добавить новый метод FormController, который сделает то же самое, поэтому нет необходимости копировать код из одной функции отправки в другую:

// config.js
export default function config($provide) {
    $provide.decorator('formDirective', $delegate => {
        const fn = $delegate[0].controller.prototype
        if (!('$setTouched' in fn)) fn.$setTouched = function() {
            if (this.$invalid) {
                Object.values(this.$error).forEach(controls => {
                    controls.forEach(control => control.$setTouched())
                })
            }
        }
        return $delegate
    })
}
// controller.js
$scope.submit = function () {
    if ($scope.form.$invalid) {
        $scope.form.$setTouched();
        alert("Form is invalid.");
    }
};

В случае, если кто-то задается вопросом, почему кто-то хочет выполнить такую ​​проверку: проверка на ограничение IOS отсутствует, поэтому ng-submit вызывается даже на недопустимых формах.

Ответ 4

Если вы любите uisng ES6 + lodash fp

import forEach from 'lodash/fp/forEach'

    validate()
    {
        forEach(forEach(field => field.$setTouched()))(this.form.$error)
    }

<form name="$ctrl.form">...</form>

Ответ 5

Я не уверен, почему вы думаете, что вам нужно "прикоснуться" к полям, просто используйте регулярную проверку формы; вам просто нужно обернуть поля в действительный элемент формы, а затем angular позаботиться о валидации для вас. Вот рабочий пример..

Вам действительно не нужно проверять значение $touched или даже устанавливать его (если только не существует конкретной причины, почему вам нужно это сделать?) - просто используйте требуемый атрибут в полях ввода, если они являются обязательными:

<input name="namefield" "text" ng-model="user.firstName" required/>