2015 年 1 月 17 日更新:
正如 Leblanc Meneses 在评论中指出的那样,Angular 1.3现在支持使用form
,ngForm
和input
指令进行插值。
这意味着使用表达式来命名您的元素:
<div ng-form="namesForm_{{$index}}" ng-repeat="name in names">
<input type="text"
name="input_{{$index}}_0"></input>
<!-- ... -->
</div>
将按预期工作:
$scope['namesForm_0']
$scope.namesForm_1
// Access nested form elements:
$scope.namesForm_1.input_1_0
...
Angular <= 1.2 的原始答案:
使用表单ngFormController
会很快变得棘手。
您需要注意,您可以动态添加表单元素和输入,但不能动态命名ngForm
它们 - 插值在orname
指令中不起作用。
例如,如果您尝试像这样动态命名嵌套表单:
<div ng-form="namesForm_{{$index}}" ng-repeat="name in names">
<!-- ... -->
</div>
而不是像这样在范围内提供所有嵌套表单:scope['namesForm_0']
您只能访问具有文字 name 的单个(最后一个)表单scope['namesForm_{{$index}}']
。
在您的情况下,您需要创建一个自定义指令,该指令将与ngForm
处理设置$pristine$
和$invalid
该表单实例一起添加。
JavaScript:
该指令将监视$dirty
其表单的状态以设置$validity
在脏时防止提交并在$pristine
按下“清洁”按钮时处理设置状态。
app.directive('formCleaner', function(){
return {
scope: true,
require: '^form',
link: function(scope, element, attr){
scope.clean = function () {
scope.namesForm.$setPristine();
};
scope.$watch('namesForm.$dirty', function(isDirty){
scope.namesForm.$setValidity('name', !isDirty);
});
}
};
});
HTML:
然后,对 HTML 的唯一更改是添加formCleaner
指令。
所以改变你原来的HTML:
<body ng-controller="MainCtrl">
<form name="mainForm" submit="submit()">
<h3>My Editable List</h3>
<div ng-form="namesForm"
ng-repeat="name in names">
<!-- ... -->
</div>
<button class="btn btn-default" type="submit">Submit</button>
</form>
</body>
为此,通过在form-cleaner
旁边添加ng-form
:
<body ng-controller="MainCtrl">
<form name="mainForm" submit="submit()">
<h3>My Editable List</h3>
<!-- Add the `form-cleaner` directive to the element with `ng-form` -->
<div form-cleaner
ng-form="namesForm"
ng-repeat="name in names">
<!-- ... -->
</div>
<button class="btn btn-default" type="submit">Submit</button>
</form>
</body>
这是显示新行为的更新 Plunker:http ://plnkr.co/edit/Lxem5HJXe0UCvslqbJr3?p=preview