В итоге я создал свою собственную директиву для этого.Я считаю, что следующая директива, когда применяется, будет вести себя эквивалентно следующему:
form(name='addressForm')
input(
type='text'
name='city'
ng-class='addressForm.city.$invalid && (addressForm.city.$touched || addressForm.$submitted) ? "error" : ""'
)
Вместо того, чтобы все, что я могу сделать:
form(name='addressForm')
input(
type='text'
name='city'
validate-for='addressForm'
)
директива будет проверять действительность на:
- Blur
- Форма представления
- Изменение стоимости
Вот код (ES6):
'use strict';
class ValidateFor {
constructor() {
this.restrict = 'A';
this.require = 'ngModel';
this.link = ($scope, $element, $attrs, ngModel) => {
var form = $scope[$attrs.validateFor];
var field = form[$element.attr('name')];
$scope.$on('form-submitted',() => {
this.checkForErrors(field, $element);
});
$scope.$watch(() => ngModel.$modelValue,() => {
if (field.$touched) {
this.checkForErrors(field, $element);
}
});
$element.bind('blur',() => {
this.checkForErrors(field, $element);
});
};
}
checkForErrors(field, $element) {
if (field.$invalid) {
$element.addClass('error');
} else {
$element.removeClass('error');
}
}
}
ValidateFor.$inject = [];
Вы могли бы даже устранить необходимость подачи имя формы в validate-for
. Я просто сделал это, потому что у меня есть ситуации с вложенными формами.
Разве вы не можете обернуть это каким-то помощником? –
, вы можете проверить недопустимые поля в событии отправки, а затем вы можете изменить это на '' ng-class = '{' error ': addressForm [имя-поля-здесь] .invalid} "' ' – tbutcaru
@DaveNewton Я предполагаю, что это возможность. Открыта для предложений о том, как это может произойти. –