Ответ 1
Попробуйте выполнить мою собственную директиву:
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>
Объяснение проблемы:
По умолчанию элементы ввода, использующие ngModelController (ng-model
), вызывают FormController.$addControl
, когда они связаны с самим регистром и выставляют свойство на FormController
с свойством имени ввода, которое {{ field.name }}
в этом случае. Поэтому, несмотря на то, что элемент управления зарегистрирован, но у вас нет открытых свойств на FormController
с именем email
, firstName
, у вас есть только {{ field.name }}
, ссылающийся на последний элемент ввода
Объяснение решения:
В этом решении я создал настраиваемую директиву, чтобы заменить {{ field.name }}
на правильное имя во время выполнения.
Для получения дополнительной информации, почему я должен использовать terminal:true,
и priority:1000
, ознакомьтесь с этим обсуждением: Добавить директивы из директивы в AngularJS