2014-01-30 6 views
15

Я пытаюсь проверить некоторые поля формы, которые даны мне от серверной конечной точки ...AngularJS динамического поля формы проверки

Поэтому в основном input элементы динамически создаваемые внутри ng-repeat. Поэтому input атрибуты также добавлены динамически, например, type, name и т.д ...

Однако, поскольку атрибут name динамически добавляется, когда я пытаюсь проверить это, как это, например:

myForm.elName.$valid 

Он ничего не возвращает, потому что на данный момент он не знает, что такое elName.

Я создал jsFiddle, чтобы продемонстрировать эту проблему: http://jsfiddle.net/peduarte/HB7LU/1889/

Любая помощь или совет будет высоко ценится!

FANX.

EDIT:
Я со ссылкой на эти УДИВИТЕЛЬНЫЕ документации: http://docs.angularjs.org/api/ng.directive:input.email

+0

Пожалуйста, развиваться. Почему вы жалеете о каждой секунде angularJS? – Ant

+1

Это то, что вы ищете http://stackoverflow.com/questions/27071413/dynamic-form-name-attribute-input-type-text-name-variable-name-in – SoEzPz

ответ

35

Попробуйте мою пользовательскую директиву:

myApp.directive("dynamicName",function($compile){ 
    return { 
     restrict:"A", 
     terminal:true, 
     priority:1000, 
     link:function(scope,element,attrs){ 
      element.attr('name', scope.$eval(attrs.dynamicName)); 
      element.removeAttr("dynamic-name"); 
      $compile(element)(scope); 
     } 
    }; 
}); 

Использования:

<input dynamic-name="field.name" 
     type="{{ field.type }}" 
     placeholder="{{ field.name }}" 
     ng-model="field.value" 
     required> 

DEMO

Объяснение проблемы:

По умолчанию элементы ввода с использованием ngModelController (ng-model) называют FormController.$addControl, когда они связаны с зарегистрировать себя и выставить свойство на FormController с имя свойства входа который в этом случае равен {{ field.name }}. Поэтому, даже если контроль зарегистрирован, но вы не выставили свойства на FormController с именем email, firstName, у вас есть только {{ field.name }} ссылка последних входной элемент

Объяснения решения:

В этом решении я создал специальную директиву для замены {{ field.name }} с правильным именем во время выполнения.

Для получения дополнительной информации, почему я должен использовать terminal:true, и priority:1000, проверить это обсуждение: Add directives from directive in AngularJS

+1

В качестве изолированной области можно использовать вместо scope. $ eval: 'scope: {dynamicName: '='}' в конфигурации директивы, а затем просто 'scope.dynamicName' внутри 'link'. –

+1

@ Хьюго Вуд: Я не думаю, что нам нужно изолировать сферу действия здесь. Цель этой директивы - «изменить текущий элемент» на основе «текущей области». Использование текущей области действия является более подходящим ИМО. –

+0

Могу ли я прокручивать сообщения об ошибках динамически? они жестко закодированы в демо – sisimh

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