AngularJS 强制验证或等待 $scope.myForm.$valid 刷新

5

我在Javascript中更新了$scope,现在想知道表单是否有效。如何强制进行验证或等待Angular运行验证?

以下是一些示例代码。当我点击按钮时,$scope.validateA = true使表单无效,但不会立即生效。因此,在下一行代码中,如果我查看$scope.abForm.$valid,它仍然是true

var validationApp = angular.module('validationApp', []);

validationApp.controller('mainController', function($scope) {
  $scope.submitA = function() {
    $scope.validateA = true;
    //force validation to run here??
    alert($scope.abForm.$valid);
  };
});


<div ng-app="validationApp" ng-controller="mainController">
    <form name="abForm">
      a
      <input ng-required='validateA' ng-model='a'>
      <button type="button" ng-click="submitA()">submit a</button>
    </form>
</div>

See the sample in Plunker


1
你想动态更改必填属性的原因是什么?如果直接将 ng-required 指令设置为 true,它可以正常工作。http://plnkr.co/edit/ykjALPsvT6z2C0o6SrzV?p=preview - m.e.conroy
@m.e.conroy 我的实际情况是我有一个“提交”按钮,它运行完整的验证集,以及一个“保存”按钮,它只运行较小的验证集,这样用户就可以保存他们正在进行的工作。 - Ande
1个回答

6

您说得对,Angular 没有执行 $digest 来设置表单的有效/无效属性。

您需要等待下一个 $digest 循环。您不能强制执行,但可以等待它,如果使用没有等待时间的 $timeout,则可以强制您的警报语句等待下一个 $digest 循环,在该循环中,表单的任何输入都将得到验证。

http://plnkr.co/edit/mjPuDPhS8bnbN15lO7yF?p=preview

我已将此添加到您的 plunker:

validationApp.controller('mainController',function($scope,$timeout){
    $scope.submitA = function(){
        $scope.validateA = true
        $timeout(function(){
            alert($scope.abForm.$valid);
        });
    };
});

1
这不是理想的解决方案,但我也认为在提交时将表单元素设置为必填项也不理想。你所做的是在提交阶段改变表单操作方式。 - m.e.conroy
谢谢。在我发布问题之前,我开始认为打开/关闭字段验证的方式可能与Angular的本意相悖。但是由于解决方案就是将回调传递给$timeout,所以我认为此验证代码仍然可以很好地工作。 - Ande

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接