2015-01-08 91 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

相關問題