У меня есть форма, достаточно большая.
Есть уже сработанный механизм по отображению ошибок на форме, он завязан на стандартную AngularJS валидацию + своя директива для отображения ошибок серверной валидации.
Все работает, но есть одно "но" - html-код формы после добавления к элементам всех этих директив становится мусорной кучей. Надо ведь ng-class везде добавить, чтобы элемент формы выделить, да еще бы под него запихать списочек проблем, которые с ним возникли.
Захотелось сделать директиву, которая брала бы данные из объекта в $scope и на основании данных в нем применяла бы нужные директивы элементам формы на лету.
Например:
$scope.formSettings = {
'required': ['title','description','date_from'],
'server': ['title','description']
}
Я сделал директиву, которая добавляет ngRequired элементу при линковке, она даже работает. Выглядит как-то так:
return app.directive('formControl', [
'$compile', '$injector', function($compile, $injector) {
return {
priority: 0,
require: '?ngModel',
link: function($scope, element, attrs, controller) {
var required;
attrs.$set('ngRequired', "" + attrs.formControl + ".required('" + (element.attr('name')) + "')");
required = $injector.get('requiredDirective')[0];
return required.link($scope, element, attrs, controller);
}
};
}
]);
Дело в том, что в таком варианте не обрабатывается само выражение, заданное для ng-required - элемент всегда считается required.
Как быть? Я даже полистал код AngularJS, нашел объявление директивы, но как там происходит обработка выражения из ngRequired хоть убей - не пойму.
Вижу, что стоит
attr.$observe('required', function() {
validator(ctrl.$viewValue);
});
AngularJS 1.2.2