我正在构建一个Angular表单,需要ngRepeat
内可重复的表单元素。
<form name="form">
<div ng-repeat="x in [1,2,3,4]">
<input name="something_{{$index}}" ng-model="hi" required>
<div ng-messages="form.something_{{$index}}.$error">
<ng-message="required">This is required</ng-message>
</div>
</div>
<pre>{{form | json: 4}}</pre>
</form>
Angular现在支持动态声明的input
名称,因此您不必执行以下操作:
<div ng-repeat="x in [1,2,3,4] ng-form="repeated-form"></div>
您可以在{{$index}}
内使用ngRepeat
动态声明项目。但这似乎不适用于ngMessages
,当我尝试将索引绑定到它时会抛出错误。
即。这样:
<div ng-messages="form.something_{{$index}}.$error">
抛出这个:
Error: [$parse:syntax] Syntax Error: Token '{' is an unexpected token at column 16 of the expression [form.something_{{$index}}.$error] starting at [{{$index}}.$error].
如果ng-messages无法观察使用{{$ index}}声明的表单值,我们如何动态声明表单上的哪个属性?
PLNKR:http://plnkr.co/edit/4oOasbtffTgKqmxcppUG?p=preview(检查控制台)
答案 0 :(得分:17)
ng-messages="form['something_' + $index].$error"
应该有效。我通常不会将{{}}放在任何ng指令中,因为大多数ng指令都以优先级0执行(包括{{}}指令ngBind)。此外,ng指令都对其参数使用$ evaluate,因此默认情况下它们会查看范围中的变量值。
同一元素上的多个指令的优先级0意味着Angular不能保证首先应用哪个指令。因此,通常最好避免一起使用ngDirectives,因为行为可能会有所不同。 ngIf是一个例外,因为它以优先级600执行(这就是为什么指令不是针对当前不在DOM中的ng-if元素进行评估的原因。)
答案 1 :(得分:7)
<div ng-repeat="x in [0,1,2,3]">
<input name="something_{{$index}}" ng-model="hi" required>
<div ng-messages="form['something_' + $index].$error">
<ng-message="required">This is required</ng-message>
</div>
</div>