AngularJS: 在异步验证器完成之前阻止表单提交

AngularJS: Preventing form submission until asyncronous validator is complete

我想阻止在异步验证器正在 运行 或将要 运行 时启用提交按钮。

我有一个自定义指令,我在其中监听输入的更改事件。此输入元素上是一个异步验证器,它将在触发输入值更改事件时触发。

input.on('change', function () {
      ngModel.$setViewValue(input.val(), 'change');
});

ngModel.$asyncValidators.modelValue = function () { ... }

问题是,直到用户取消对输入元素的关注,异步验证器才会触发。这是一个问题,因为在异步验证程序触发之前,表单上的 $pending 字段不会更新。我希望能够执行以下操作以防止提交表单:

<button ng-disabled="form.$invalid || form.$pending" ng-click="form.submit()">Submit</button>

但是,即使异步验证器将在不久的将来 运行 提交表单,仍然可以提交表单,因为 $pending 尚未更新,因为用户尚未取消对输入元素的关注。只要用户将注意力集中在输入元素上,就可以提交表单。

在 AngularJS 中处理此问题的正确方法是什么?

尝试在 keydown 上设置一个特殊的范围参数,这将禁用提交。然后在异步回调触发时将其关闭。

js:

input.on('keydown', function () {
  $scope.needsValidation = true;
});

ngModel.$asyncValidators.modelValue = function () {
 ...
 $scope.needsValidation = false;    
 ... 
}

Html:

<button ng-disabled="form.$invalid || form.$pending || needsValidation" ng-click="form.submit()">Submit</button>