使用Angular时表单元素是否需要name属性?

时间:2015-01-08 20:54:20

标签: javascript html angularjs angularjs-ng-model

我现在使用Angular JS进行所有表单管理。输入数据存储在关联的ngModel中,可以在$scope的{​​{1}}处理。

所以我有这样的表单设置:

controller

这在所有主流浏览器中都能正常运行(除了我还没有测试过IE)。您会注意到我还没有在输入或textarea上包含名称属性。我出于任何原因需要它们吗?我之前已阅读以下内容:

<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>

但我的数据传递得非常好,因为它绑定到Note: Only form elements with a name attribute will have their values passed when submitting a form. 。是正确的方法 - 包括或不包括名称属性?

2 个答案:

答案 0 :(得分:5)

您需要元素的name属性以及ng-model,以便将实例添加到formController,并在控件或表单上进行任何验证。此外,如果您要提交表单(表单上的操作),则只有具有name属性的表单元素将提交给服务器。请参阅native form validation and submission process

在ngModelController实例中有一个名为$name的属性,它只是元素的名称。

ngModelController source

this.$name = $attr.name; 

ng-model指令在其父窗体控制器实例(如果存在)上调用$addControl方法,它将实例添加为formController实例上带有name的键的值,如果你这样做的话没有名字,那么它就不会被关联,也不会发生角度验证。

FormController Source

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;
    }

因此,在您的情况下,如果您不依赖于角度形式控制器验证或不提交带有操作的表单,则不需要name

答案 1 :(得分:4)

您描述的功能不需要名称属性,因为如您所述,ng-model已将数据绑定到控制器。但是,如果您想要为表单包含验证,则必须使用name属性在ui中链接彼此相关的元素。这是输入的angularjs api文档的链接:https://docs.angularjs.org/api/ng/directive/input。在底部,您将看到我所指的验证。

简单地回答您的问题:不,名称属性不是必需的。 Angular中输入所需的唯一属性是ng-Model,以便将数据链接到控制器。