在Angular JS验证中解释这个明显的矛盾

时间:2013-07-10 08:51:18

标签: angularjs

鉴于此标记...

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

我可以使用以下脚本访问该字段的有效性...

myForm.myField.$error.required

但是如果我的代码在指令中,那么我需要指令依赖于ngModel,我需要像这样访问字段的有效性......

$ngModel.$valid.required

因此第一种方法使得它看起来像验证应用于表单元素,而第二种方法使得它看起来好像在模型上定义了验证。第一个似乎更准确,因为如果我直接编辑模型,我可以绕过验证。

1 个答案:

答案 0 :(得分:1)

当您为表单指定名称(例如myForm)时,Angular会使用该名称将FormController发布到当前的$ scope上,因此在您的视图中myForm是表单的FormController(这真的是$scope.myForm)。

当您为表单元素指定名称(例如myField)时,Angular会将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。)< / p>