ng-form用来在一个表单内部嵌套另一个表单。普通的HTML <form>标签不允许嵌套,但ng-form可以。
这意味着内部所有的子表单都合法时,外部的表单才会合法。这对于用ng-repeat动态创建表单是非常有用的。
由于不能通过字符插值来给输入元素动态地生成name属性,所以需要将ng-form指令内每组重复的输入字段都包含在一个外部表单元素内。
下面的CSS类会根据表单的验证状态自动设置:
表单合法时设置ng-valid;
表单不合法时设置ng-invlid;
表单未进行修改时设置ng-pristion; 表单进行过修改时设置ng-dirty。
Angular不会将表单提交到服务器,除非它指定了action属性。要指定提交表单时调用哪个JavaScript方法,使用下面两个指令中的一个。
ng-submit:在表单元素上使用。
ng-click:在第一个按钮或submit类型(input[type=submit])的输入字段上使用。
为了避免处理程序被多次调用,只使用下面两个指令中的一个。
下面的例子展示了如何通过服务器返回的JSON数据动态生成一个表单。我们用ng-loop来遍历从服务器取回的所有数据。由于不能动态生成name属性,而我们又需要这个属性做验证,所以在循环的过程中会为每一个字段都生成一个新表单。
由于AngularJS中用来取代<form>的ng-form指令可以嵌套,并且外部表单在所有子表单都合法之前一直处于不合法状态,因此我们可以在动态生成子表单的同时使用表单验证功能。是的,鱼和熊掌可以兼得。
下面先看一下我们硬编码的JSON数据,把它假设成是从服务器返回的:
angular.module('myApp',[]) .controller('FormController',function($scope) {
$scope.fields = [
{placeholder: 'Username', isRequired: true},{placeholder: 'Password', isRequired: true},{placeholder: 'Email (optional)', isRequired: false}
];
$scope.submitForm = function() { alert("it works!");
};});
下面用这些数据生成一个有验证功能的动态表单:
<form name="signup_form" ng-controller="FormController" ng-submit="submitForm()" novalidate> <div ng-repeat="field in fields"
ng-form="signup_form_input"> <input type="text"
name="dynamic_input" ng-required="field.isRequired" ng-model="field.name" placeholder="{{field.placeholder}}" />
<div ng-show="signup_form_input.dynamic_input.$dirty && signup_form_input.dynamic_input.$invalid"> <span class="error"
ng-show="signup_form_input.dynamic_input.$error.required">The field is required.
</span> </div>
</div> <button type="submit"
ng-disabled="signup_form.$invalid"> Submit All
</button> </form>
input.ng-invalid { border: 1px solid red;
}
input.ng-valid { border: 1px solid green;
}