2015-01-08 52 views
4

我现在使用Angular JS进行所有表单管理。输入数据被存储到相关的ngModel,可以在controller$scope中处理。使用Angular时,表单元素是否需要name属性?

所以我有形式的设置是这样的:

<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)。您会注意到我没有在输入或textarea中包含名称属性。我是否因为任何原因需要他们?我读过之前的情况如下:

Note: Only form elements with a name attribute will have their values passed when submitting a form. 

但因为它绑定到我的ngModel数据传递精绝。是正确的方法 - 包括或不包含名称属性?

回答

5

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

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

ngModelController source

this.$name = $attr.name; 

和NG-模型指令其父表单控制器实例调用$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; 
    } 

所以你的情况,你不需要有name,如果你不靠角形式控制器的验证或不与动作提交表单。

+0

辉煌,感谢您为我清理那个 – Coop

+0

欢迎您.. :) – PSL

4

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

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

+0

啊是的,我忘了验证。感谢您的回复 – Coop

相关问题