【发布时间】:2013-02-16 06:19:10
【问题描述】:
通常,使用表单和输入字段,表单控制器会发布到表单名称属性下的相关范围。并且,NgModelController 在输入名称属性下发布。
因此对于带有 ngModel 指令的输入字段,可以像 $scope.myFormName.myInputFieldName 一样检索输入字段的 NgModelController
问题是如何为 ngRepeat 指令中的输入字段做同样的事情(获取 NgModelController)?
我想使用 $index 作为名称的一部分来命名输入字段,以便每个模板实例都是唯一命名的。这样就可以了,所以
<input name="foo_{{$index}}" ...
将具有 $index == 3 的实例渲染为
<input name="foo_3" ...
但尝试通过已发布的名称获取 ngModelController 不起作用(未定义),例如:
$scope.myFormName.foo_3
显示此内容的 plunker 在这里:http://plnkr.co/edit/jYDhZfgC3Ud0fXUuP7To?p=preview
它显示成功获取“普通”输入元素的 ngModelController 并调用 $setValidity,还显示未能获取 ngRepeat 指令内的输入元素的 ngModelController。
从下面的 plunker 复制了相关的代码部分:
<div ng-repeat="element in elements">
<div ng-class="{error: form['foo_{{$index}}'].$invalid}">
<input name="foo_{{$index}}" ng-model="element.a" type="number">
<span ng-show="form['foo_{{$index}}'].$error.bar">ngRepeat bar invalid</span>
</div>
</div>
{{form.foo_0.$setValidity('bar', false)}}
【问题讨论】:
-
我猜问题是 ng-repeat 创建了一个新范围,并且您不能简单地访问子范围:类似于这里的答案:stackoverflow.com/questions/14491433/… 抱歉,我没有一个好主意除了现在编写自定义指令之外,如何更改它:/
标签: angularjs angularjs-ng-repeat