У меня есть таблица, созданная с помощью ng-repeat. Я хочу добавить проверку для каждого элемента в таблице. Проблема в том, что каждая входная ячейка имеет то же имя, что и ячейка над и под ней. Я попытался использовать это {{$index}}
значение для именования входных данных, но, несмотря на то, что строковые литералы в HTML выглядят правильно, теперь оно работает.
Вот мой код на данный момент:
<tr ng-repeat="r in model.BSM ">
<td>
<input ng-model="r.QTY" class="span1" name="QTY{{$index}}" ng-pattern="/^[\d]*\.?[\d]*$/" required/>
<span class="alert-error" ng-show="form.QTY{{$index}}.$error.pattern"><strong>Requires a number.</strong></span>
<span class="alert-error" ng-show="form.QTY{{$index}}.$error.required"><strong>*Required</strong></span>
</td>
</tr>
Я попытался удалить {{}}
из индекса, но это тоже не работает. На данный момент свойство проверки ввода работает правильно, но сообщение об ошибке не отображается.
У кого-нибудь есть предложения?
Изменить: В дополнение к отличным ответам ниже, в статье блога, которая более подробно освещает эту проблему: http://www.thebhwgroup.com/blog/2014/08/angularjs-html-form-design-part-2 /
источник
Ответы:
AngularJS использует входные имена для выявления ошибок валидации.
К сожалению, на сегодняшний день невозможно (без использования пользовательской директивы) динамически генерировать имя входа. Действительно, проверяя входные документы, мы видим, что атрибут name принимает только строку.
Чтобы решить проблему с «динамическим именем», вам нужно создать внутреннюю форму (см. Ng-form ) :
Другой альтернативой будет написать специальную директиву для этого.
Вот jsFiddle, показывающий использование ngForm: http://jsfiddle.net/pkozlowski_opensource/XK2ZT/2/
источник
ng-form
элементы DOM, поэтому ссылка на другой вопрос SO здесь не актуальна.ng-repeat
связаны,table tr
то вы должны использоватьng-form="myname"
attr.Поскольку вопрос был задан, команда Angular решила эту проблему, позволив динамически создавать входные имена.
С Angular версии 1.3 и выше вы можете сделать это:
демонстрация
В Angular 1.3 также появился ngMessages, более мощный инструмент для проверки форм. Вы можете использовать ту же технику с ngMessages:
источник
$valid
свойство для ввода получает неправильноfalse
Если вы не хотите использовать ng-form, вы можете использовать пользовательскую директиву, которая изменит атрибут name формы. Поместите эту директиву как атрибут в тот же элемент, что и ваша ng-модель.
Если вы используете совместно другие директивы, будьте осторожны, чтобы у них не было установлено свойство «терминала», иначе эта функция не сможет работать (учитывая, что она имеет приоритет -1).
Например, при использовании этой директивы с ng-options, вы должны запустить этот однострочный monkeypatch: https://github.com/AlJohri/bower-angular/commit/eb17a967b7973eb7fc1124b024aa8b3ca540a155
Я часто нахожу полезным использовать ng-init для установки $ index на имя переменной. Например:
Это изменит ваше регулярное выражение на:
Если у вас есть несколько вложенных ng-повторов, теперь вы можете использовать эти имена переменных вместо $ parent. $ Index.
Определение «терминала» и «приоритета» для директив: https://docs.angularjs.org/api/ng/service/ $ compile # directive-definition-object
Комментарий Github относительно необходимости в ng-option monkeypatch: https://github.com/angular/angular.js/commit/9ee2cdff44e7d496774b340de816344126c457b3#commitcomment-6832095 https://twitter.com/aljohri/status/4829636915
ОБНОВИТЬ:
Вы также можете сделать это с помощью ng-формы.
источник
Используйте директиву ng-form внутри тега, в котором вы используете директиву ng-repeat. Затем вы можете использовать область, созданную директивой ng-form, для ссылки на общее имя. Например:
Кредит: http://www.benlesh.com/2013/03/angular-js-validating-form-elements-in.html
источник
ng-form="formName"
к тегу, который имеет ng-repeat ... это сработало как шарм :)Добавлен более сложный пример с «пользовательской проверкой» на стороне контроллера http://jsfiddle.net/82PX4/3/
источник
Если посмотреть на эти решения, то предложенное Аль Джохри выше всего соответствует моим потребностям, но его директива была немного менее программируемой, чем я хотел. Вот моя версия его решения:
Это решение позволяет просто передать выражение генератора имени в директиву и избежать блокировки при замене шаблона, которую он использовал.
Сначала у меня также были проблемы с этим решением, поскольку оно не показывало пример использования его в разметке, поэтому вот как я его использовал.
У меня есть более полный рабочий пример на github .
источник
проверка работает с повторением ng, если я использую следующий синтаксис,
scope.step3Form['item[107][quantity]'].$touched
я не знаю, что это лучшая практика или лучшее решение, но это работаетисточник
Опираясь на pkozlowski.opensource в ответе , я добавил способ иметь название динамического ввода , которые также работают с ngMessages . Обратите внимание на
ng-init
часть наng-form
элемент и использованиеfurryName
.furryName
становится именем переменной , которая содержит значение переменной дляinput
«sname
атрибута.источник
Это слишком поздно, но может быть, это может помочь любому
fromname[uniquname].$error
Образец кода:
Посмотреть рабочий демо здесь
источник
Если вы используете ng-repeat $ index, работает так
и
мы должны показать нг-шоу в нг-шаблоне
источник
Это возможно, и вот как я делаю то же самое с таблицей входов.
оберните стол в такую форму
Тогда просто используйте это
У меня есть форма с несколькими вложенными директивами, которые содержат входные данные, выберите (ы) и т. Д. ... Все эти элементы заключены в NG-повторы и динамические строковые значения.
Вот как использовать директиву:
Примечание: вы можете добавлять и индексировать конкатенацию строк, если вам нужно сериализовать, возможно, таблицу входов; что я и сделал
Это должно обрабатывать многие ситуации, когда вы просто не знаете, где будет форма. Или, возможно, у вас есть вложенные формы, но по какой-то причине вы хотите прикрепить это входное имя к двум формам? Ну, просто передайте имя формы, к которой вы хотите присоединить имя ввода.
То, что я хотел, - это способ назначать динамические значения входным данным, которые я никогда не узнаю, а затем просто вызывать $ scope.myFormName. $ Valid.
Вы можете добавить все, что пожелаете: больше таблиц, больше форм ввода, вложенные формы, все, что вы хотите. Просто передайте имя формы, с которой вы хотите проверить вводимые данные. Затем при отправке формы спросите, действителен ли $ scope.yourFormName. $
источник
Это приведет к тому, что имя в ng-repeat появится отдельно в проверке формы.
Но у меня возникли проблемы с поиском его в сообщении проверки, поэтому мне пришлось использовать ng-init, чтобы получить разрешение переменной в качестве ключа объекта.
источник
Вот пример того, как я это делаю, я не знаю, является ли это лучшим решением, но работает отлично.
Во-первых, код в HTML. Посмотрите на ng-класс, он вызывает функцию hasError. Посмотрите также на объявление имени входа. Я использую $ index для создания разных входных имен.
А теперь вот функция hasError:
источник
Мои требования немного отличались от тех, которые были заданы в первоначальном вопросе, но, надеюсь, я мог бы помочь кому-то, кто переживает ту же проблему, что и я ...
Я должен был определить, было ли поле обязательным или нет, основываясь на переменной области видимости. Поэтому я в основном должен был установить
ng-required="myScopeVariable"
(это булева переменная).источник