为什么无效的表格一开始是有效的,然后马上就无效了?

Why does an invalid form is valid at first and right after turns out invalid?

为了简化事情,我制作了一个示例表格来描述我的问题:

<form novalidate name="form">
  <input required name="foo" ng-model="my.foo">
</form>

还有控制器:

angular.module('sample', []).controller('MainController', function($scope) {
  $scope.$watch('form.$valid', function (valid) {
    console.log(valid);
  });
});

预期结果:

> false

实际结果:

> true
> false

谁能告诉我为什么表格一开始是有效的然后就变得无效了(顺便说一句,它应该是什么)?

Working demo

实际上我确定这是由于指令优先级。

在angularJS中<form>实际上是一个指令。 required 是另一个。

假设我们有一个未经验证的表单。该表格始终有效。我很确定现在我们可以说默认情况下表单是有效的。

"form" 指令的优先级高于 "required"。这意味着在某个时刻。 Angular 应用 "form" 指令,而不是 "required" 指令。这会生成一个有效表单,其中输入的属性未知 "required"。下一个摘要将分析 "required" 指令。发现输入为空,设置valid为false。

正如 Omri 所说,这是一个指令优先级和摘要周期的问题。