2013-07-10 52 views
0

鑑於這種標記...解釋角JS驗證這個明顯的矛盾

<form name="myForm"> 
     <input type="text" name="myField" required ng-model="field1" /> 
</form> 

我可以用下面的腳本訪問該字段的有效性...

myForm.myField.$error.required 

但是,如果我的代碼是指令中,然後我需要的指令依賴於ngModel,我需要訪問像這樣的字段的有效性...

$ngModel.$valid.required 

因此,第一種方法使得它看起來像驗證應用於表單元素,第二種方法使得它看起來好像在模型上定義了驗證。第一個似乎更準確,因爲如果我直接編輯模型,我可以循環驗證。

回答

1

當你給一個形式的名稱,如myForm,角用這個名字,所以在你看來myForm是窗體的FormController(這是真的$scope.myForm)出版FormController到當前$範圍。

當你給一個表單元素的名稱,如myField,角出版ngModelController到的FormController,所以在你看來myForm.myField是表單元素的ngModelController(這是真的$scope.myForm.myField)。

在指令中,如果指令沒有定義新的作用域,它可以通過作用域...或(更常見的情況下)以同樣的方式訪問FormController和ngModelControllers ...如果指令是定義在特定的表單元素上,它可以使用require: 'ngModel'來獲取對該表單元素的ngModelController的引用。

在你的兩個例子中,myForm.myField...$ngModel...(我假設$ ngModel是鏈接函數的第四個參數)都訪問表單元素的ngModelController。

(什麼是$ngModel.$valid.required?ngModelController有$valid屬性,但它似乎沒有爲對象的散列,所以我會想到剛$ngModel.$valid使用。)

+0

我發現$ ngModel。$有效以一個對象散列。它有一個名爲'required'的屬性,被設置爲true或false。 –

+0

我認爲Angular JS已經犯了與ASP.net WebForms相同的錯誤。他們已經在UI上而不是在模型上進行了驗證。使用ASP.net MVC,UI驗證代碼是從模型屬性上定義的屬性生成的。 –