2013-09-20 5 views
12

Я пытаюсь написать угловую директиву, которая добавляет атрибуты проверки тегу, но, похоже, она не работает. Вот моя демонстрация. Вы заметите, что «Is Valid» остается верным, если вы удаляете текст во втором поле ввода, но при этом выдается сообщение «false», если вы удаляете текст в первом поле ввода.Как добавить атрибуты проверки в директиву angularjs

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); 
     } 
    }; 
}); 

Я предполагаю, что я просто не хватает что-то простое.

ответ

19

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

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); 
      } 
     } 
    }; 
}); 

Работа plunker: http://plnkr.co/edit/AB6extu46W4gFIHk0hIl?p=preview

+1

Я знал, что это было что-то просто. Это, как говорится, не делает его менее ценным для меня :) –

+1

Это не работает для меня. @ Решение Зимотика ниже работало. – jbustamovej

1

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

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

+0

Этот ответ заключается в том, как конкретно решить проблему динамического требуемого атрибута, а 'ng-required' - лучшее решение для этой конкретной проблемы. Также см. Связанный ответ http://stackoverflow.com/a/23748401/404699 – steampowered

10

Будьте осторожны бесконечных петель и перекомпилирует, лучшим решением здесь: Add directives from directive in 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); 
      } 
     }; 
     } 
    }; 
    }); 

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

+0

+1 Это сработало. –

+1

Проделал большое спасибо @ Zymotik. Обратите внимание, что замена не нужна, поскольку по умолчанию используется значение false, а замена - [устаревшая] (https://docs.angularjs.org/api/ng/service/$compile) по крайней мере с версии 1.2.26. – jbustamovej

Смежные вопросы