Angularjs 在模型更新之前,ngForm无效

Angularjs 在模型更新之前,ngForm无效,angularjs,angularjs-ng-form,Angularjs,Angularjs Ng Form,在我的应用程序中,我会在做一些事情之前检查表单是否有效。问题是ngForm在我使用它之前不会编译模型 例如: JS $scope.results = []; $scope.$watch(function() { return $scope.testForm.$valid; }, function( valid ) { $scope.results.push( valid ); } ) HTML <ng-form name="testFo

在我的应用程序中,我会在做一些事情之前检查表单是否有效。问题是ngForm在我使用它之前不会编译
模型

例如:

JS

  $scope.results = [];
  $scope.$watch(function() {
    return $scope.testForm.$valid;
  },
    function( valid ) {
      $scope.results.push( valid );
    }
  )
HTML

<ng-form name="testForm" ng-init="test = 1">
  <input ng-model="test" required>
</ng-form>

<p ng-repeat="result in results track by $index" ng-class="{'false': !result, 'true': result}">{{ result }}</p>

表单一开始不应无效,因为
$scope.test
设置为1


有什么线索吗?

不确定是否正确理解,但可能是AngularJS第一次检查时

$scope.results = [];
为空,因此在您将任何内容推入它之前,结果求值为false

如果以非空结果开始,请说:

$scope.results = [1];
第一个评价是真实的

我认为$watch不是合适的方法。我认为您的问题与$watch的工作方式以及角度的摘要周期有关。

根据

在向作用域注册观察程序后,异步调用侦听器
fn
(通过
$evalAsync
)以初始化观察程序。在极少数情况下,这是不可取的,因为在
watchExpression
的结果没有更改时调用侦听器。要在侦听器中检测此场景,可以比较
newVal
oldVal
。如果这两个值相同(==),则由于初始化而调用了侦听器


使用检查忽略第一次调用(几乎总是)是有意义的:

$scope.$watch('testForm.$valid', function (newValue, oldValue) {
    if (newValue === oldValue) { return; }
    $scope.results.push(newValue);
});

另请参见,表单一开始不应该无效,因为
$scope.test
设置为1。好的,很抱歉我对$watch的评论,但正如ExpertSystem所说,第一次$digest传递错误从角度看是“正常”行为。
$scope.$watch('testForm.$valid', function (newValue, oldValue) {
    if (newValue === oldValue) { return; }
    $scope.results.push(newValue);
});