【问题标题】:Is name attribute required on form elements when using Angular?使用 Angular 时,表单元素是否需要 name 属性?
【发布时间】:2015-01-08 20:54:19
【问题描述】:

我现在使用 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。是正确的方法 - 包括或不包括名称属性?

【问题讨论】:

    标签: javascript html angularjs angularjs-ng-model


    【解决方案1】:

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

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

    ngModelController source

    this.$name = $attr.name; 
    

    并且 ng-model 指令在其父 formcontroller 实例(如果存在)上调用 $addControl 方法,这会将实例添加为带有 name 在 formController 实例上的键的值,如果您没有名称,则它不会关联,也不会发生角度验证。

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

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

    【讨论】:

      【解决方案2】:

      您描述的功能不需要名称属性,因为正如您所说,ng-model 已经将数据绑定到控制器。但是,如果您想对表单进行验证,那么 name 属性对于在 ui 中链接元素之间的关系是必要的。这是 angularjs api 输入文档的链接:https://docs.angularjs.org/api/ng/directive/input。在底部,您会看到我所指的验证。

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

      【讨论】:

      • 啊,是的,我忘记了验证。感谢您的回复
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-24
      • 2011-10-26
      • 1970-01-01
      相关资源
      最近更新 更多