Как добавить атрибуты проверки в директиву angularjs

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

http://plnkr.co/edit/Rr81dGOd2Zvio1cLYW8D?p=preview

Вот моя директива:

angular.module('demo', [])
.directive('metaValidate', function () {
    return {
        restrict: 'A',
        link: function (scope, element, attrs) {
            element.attr("required", true);
        }
    };
});

Я предполагаю, что я просто пропустил что-то простое.

Ответ 1

Все правила проверки формы читаются на этапе компиляции формы, поэтому после внесения изменений в дочерний элемент node вам необходимо перекомпилировать директиву form (form это настраиваемая директива в AngularJS), Но делайте это только один раз, избегайте бесконечных циклов (ваша директива "ссылка" будет вызываться снова после компиляции формы).

angular.module('demo', [])
.directive('metaValidate', function ($compile) {
    return {
        restrict: 'A',
        link: function (scope,element, attrs) {
          if (!element.attr('required')){
            element.attr("required", true);
            $compile(element[0].form)(scope);
          }
        }
    };
});

Рабочий плункер: http://plnkr.co/edit/AB6extu46W4gFIHk0hIl?p=preview

Ответ 2

Будьте осторожны с бесконечными циклами и перекомпиляциями, лучшее решение здесь: Добавить директивы из директивы в AngularJS

angular.module('app')
  .directive('commonThings', function ($compile) {
    return {
      restrict: 'A',
      terminal: true, //this setting is important to stop loop
      priority: 1000, //this setting is important to make sure it executes before other directives
      compile: function compile(element, attrs) {
        element.attr('tooltip', '{{dt()}}');
        element.attr('tooltip-placement', 'bottom');
        element.removeAttr("common-things"); //remove the attribute to avoid indefinite loop
        element.removeAttr("data-common-things"); //also remove the same attribute with data- prefix in case users specify data-common-things in the html

        return {
          pre: function preLink(scope, iElement, iAttrs, controller) {  },
          post: function postLink(scope, iElement, iAttrs, controller) {  
            $compile(iElement)(scope);
          }
        };
      }
    };
  });

Рабочий плункер доступен по адресу: http://plnkr.co/edit/Q13bUt?p=preview

Ответ 3

Я знаю, что это довольно старый вопрос, но для чего он стоит, angular docs описывают ng-required, который принимает логическое значение. Это решило аналогичную проблему, с которой я столкнулся.

http://docs.angularjs.org/api/ng/directive/input