使用 Angular 时表单元素是否需要 name 属性?
Is name attribute required on form elements when using Angular?
我现在使用 Angular JS 进行所有表单管理。输入的数据存储到它们关联的 ngModel
,可以在 controller
的 $scope
中处理。
所以我有这样的表单设置:
<form name="addJob" novalidate data-ng-submit="addJob.$valid && addJob(job)">
<input type="text" placeholder="Job Title" data-ng-model="job.title" required />
<textarea placeholder="Brief" data-ng-model="job.brief"></textarea>
<button type="submit" data-ng-disabled="addJob.$invalid">Add Job</button>
</form>
这在所有主流浏览器中都运行良好(除了我没有测试过 IE)。您会注意到我没有在输入或文本区域中包含名称属性。我出于任何原因需要它们吗?我之前读过以下内容:
Note: Only form elements with a name attribute will have their values passed when submitting a form.
但是我的数据传递得非常好,因为它绑定到 ngModel
。是正确的方法 - 包括或不包括名称属性?
对于您描述的功能,名称属性不是必需的uired,因为正如您所说,ng-model 已经将数据绑定到控制器。但是,如果您想要对表单进行验证,则 ui 中 link 元素之间的相互关系需要 name 属性。这是 angularjs api 输入文档的 link:https://docs.angularjs.org/api/ng/directive/input。在底部,您会看到我所指的验证。
简单回答你的问题:不,name属性不是required。 Angular 中输入的唯一属性 required 是 ng-Model,以便 link 将数据上传到控制器。
您需要元素上的 name
属性以及 ng-model,以便将实例添加到 formController 以及在控件或表单上进行任何验证。此外,如果您要提交表单(表单上的操作),则只有具有 name
属性的表单元素才会提交给服务器。见 native form validation and submission process.
在 ngModelController 实例中有一个名为 $name
的 属性,它只是元素的名称。
this.$name = $attr.name;
并且 ng-model 指令在其父 formcontroller 实例(如果存在)上调用 $addControl
方法,如果在 formController 实例上使用 name
添加实例作为键的值,如果你没有名字,那么它就不会被关联,也不会发生 angular 验证。
form.$addControl = function(control) {
// Breaking change - before, inputs whose name was "hasOwnProperty" were quietly ignored
// and not added to the scope. Now we throw an error.
assertNotHasOwnProperty(control.$name, 'input');
controls.push(control);
if (control.$name) {
form[control.$name] = control;
}
因此,在您的情况下,如果您不依赖 angular 表单控制器验证或不通过操作提交表单,则不需要 name
。
我现在使用 Angular JS 进行所有表单管理。输入的数据存储到它们关联的 ngModel
,可以在 controller
的 $scope
中处理。
所以我有这样的表单设置:
<form name="addJob" novalidate data-ng-submit="addJob.$valid && addJob(job)">
<input type="text" placeholder="Job Title" data-ng-model="job.title" required />
<textarea placeholder="Brief" data-ng-model="job.brief"></textarea>
<button type="submit" data-ng-disabled="addJob.$invalid">Add Job</button>
</form>
这在所有主流浏览器中都运行良好(除了我没有测试过 IE)。您会注意到我没有在输入或文本区域中包含名称属性。我出于任何原因需要它们吗?我之前读过以下内容:
Note: Only form elements with a name attribute will have their values passed when submitting a form.
但是我的数据传递得非常好,因为它绑定到 ngModel
。是正确的方法 - 包括或不包括名称属性?
对于您描述的功能,名称属性不是必需的uired,因为正如您所说,ng-model 已经将数据绑定到控制器。但是,如果您想要对表单进行验证,则 ui 中 link 元素之间的相互关系需要 name 属性。这是 angularjs api 输入文档的 link:https://docs.angularjs.org/api/ng/directive/input。在底部,您会看到我所指的验证。
简单回答你的问题:不,name属性不是required。 Angular 中输入的唯一属性 required 是 ng-Model,以便 link 将数据上传到控制器。
您需要元素上的 name
属性以及 ng-model,以便将实例添加到 formController 以及在控件或表单上进行任何验证。此外,如果您要提交表单(表单上的操作),则只有具有 name
属性的表单元素才会提交给服务器。见 native form validation and submission process.
在 ngModelController 实例中有一个名为 $name
的 属性,它只是元素的名称。
this.$name = $attr.name;
并且 ng-model 指令在其父 formcontroller 实例(如果存在)上调用 $addControl
方法,如果在 formController 实例上使用 name
添加实例作为键的值,如果你没有名字,那么它就不会被关联,也不会发生 angular 验证。
form.$addControl = function(control) {
// Breaking change - before, inputs whose name was "hasOwnProperty" were quietly ignored
// and not added to the scope. Now we throw an error.
assertNotHasOwnProperty(control.$name, 'input');
controls.push(control);
if (control.$name) {
form[control.$name] = control;
}
因此,在您的情况下,如果您不依赖 angular 表单控制器验证或不通过操作提交表单,则不需要 name
。