Angularjs 如何为ngRepeat指令内的输入字段获取NgModelController?

Angularjs 如何为ngRepeat指令内的输入字段获取NgModelController?,angularjs,angularjs-ng-repeat,Angularjs,Angularjs Ng Repeat,通常,使用表单和输入字段,表单控制器将发布到表单名称属性下的相关范围中。并且,NgModelController在input name属性下发布。 因此,对于带有ngModel指令的输入字段,可以像$scope.myFormName.myInputFieldName那样检索输入字段的NgModelController 问题是如何对ngRepeat指令内的输入字段执行相同的操作(获取NgModelController) 我想使用$index作为名称的一部分来命名输入字段,这样每个模板实例的名称都是

通常,使用表单和输入字段,表单控制器将发布到表单名称属性下的相关范围中。并且,NgModelController在input name属性下发布。 因此,对于带有ngModel指令的输入字段,可以像
$scope.myFormName.myInputFieldName那样检索输入字段的NgModelController

问题是如何对ngRepeat指令内的输入字段执行相同的操作(获取NgModelController)

我想使用$index作为名称的一部分来命名输入字段,这样每个模板实例的名称都是唯一的。这个呈现OK,所以

<input name="foo_{{$index}}" ...
下面是一个显示这一点的plunker:

它显示为“普通”输入元素成功获取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)}}

重复条无效
{{form.foo_0.$setValidity('bar',false)}

如果我正确理解了您的问题,您正在尝试访问在
ng repeat
中创建的表单元素


请看一下这把小提琴。在按钮单击处理程序中,您将可以访问id为
myForm.foo_2
的元素。您可以注意到元素是由
myForm.foo_2
检索的,而不是
$scope.myForm.foo_2
。第二件事是,使用其范围更改值,而不使用其值属性,如
angular.element(element.scope().foo=6

@Flek认为ng repeat创建的新子作用域是问题的根源,这是正确的。因为浏览器不允许元素嵌套,所以在嵌套表单时,或者当您想在ngRepeat中进行表单验证时,必须使用ngForm


请参阅google group线程,其中显示了如何使用ng form创建内部表单,和/或@blesh。

我猜问题在于ng repeat创建了一个新的作用域,并且您无法简单地访问子作用域:与此答案类似:抱歉,除了编写自定义指令之外,我不知道如何更改它:/此答案提供了处理此问题所需的信息。我提出的解决方案是将ngForm与自定义指令结合使用。作为后台,目标是呈现服务器端验证错误;因此,服务器提交回调将在作用域中设置一个结构。指令将观察错误结构。显示此解决方案的plunkr在这里:感谢您的输入。但是,我需要访问模型的ngModelController,以便调用$setValidity方法(而不是模型本身)。
$scope.myFormName.foo_3
<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)}}