Ответ 1
if ($scope.form.$invalid) {
angular.forEach($scope.form.$error, function (field) {
angular.forEach(field, function(errorField){
errorField.$setTouched();
})
});
alert("Form is invalid.");
}
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
if ($scope.form.$invalid) {
angular.forEach($scope.form.$error, function (field) {
angular.forEach(field, function(errorField){
errorField.$setTouched();
})
});
alert("Form is invalid.");
}
Попробуйте недавно добавленные $отправленные
<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
Расширение ответа 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
вызывается даже на недопустимых формах.
Если вы любите uisng ES6 + lodash fp
import forEach from 'lodash/fp/forEach'
validate()
{
forEach(forEach(field => field.$setTouched()))(this.form.$error)
}
<form name="$ctrl.form">...</form>
Я не уверен, почему вы думаете, что вам нужно "прикоснуться" к полям, просто используйте регулярную проверку формы; вам просто нужно обернуть поля в действительный элемент формы, а затем angular позаботиться о валидации для вас. Вот рабочий пример..
Вам действительно не нужно проверять значение $touched или даже устанавливать его (если только не существует конкретной причины, почему вам нужно это сделать?) - просто используйте требуемый атрибут в полях ввода, если они являются обязательными:
<input name="namefield" "text" ng-model="user.firstName" required/>