Javascript 仅在一个验证器上解盎司

Javascript 仅在一个验证器上解盎司,javascript,angularjs,forms,validation,angularjs-directive,Javascript,Angularjs,Forms,Validation,Angularjs Directive,我刚刚读了一些很棒的东西,可能遗漏了一些东西,但是如何在特定的验证器上应用ng model optionsdebounce属性呢 让我解释一下这个问题。我有一个验证公钥的表单,为此我有一个名为key check的指令,它包含多个验证器。其中一些是本地的和同步的,就像密钥的格式一样,还有另一个异步的,用于检查密钥在服务器上是否可用(异步) 我不希望我的服务器被洪水淹没,也不希望angular应用程序被拖慢,所以我使用酷酷的孩子们称之为去Bouncing的方法,我的输入看起来像: <input

我刚刚读了一些很棒的东西,可能遗漏了一些东西,但是如何在特定的验证器上应用
ng model options
debounce
属性呢

让我解释一下这个问题。我有一个验证公钥的表单,为此我有一个名为key check的指令,它包含多个验证器。其中一些是本地的和同步的,就像密钥的格式一样,还有另一个异步的,用于检查密钥在服务器上是否可用(异步)

我不希望我的服务器被洪水淹没,也不希望angular应用程序被拖慢,所以我使用酷酷的孩子们称之为去Bouncing的方法,我的输入看起来像:

<input type="text" ... ng-model="key" key-check ng-model-options="{ debounce: 700 }" ng-minlength="5" ng-maxlength="50"/>
它的工作就像一个魔咒,但所有的检查都是以700ms的延迟完成的,我想知道是否有可能在不去抖动的情况下进行keyFormatCheck和KeyAvailability检查。我可能可以使用$timeout的旧方法,但我更喜欢用角度的方法


有什么想法吗?

ngModelController
debounce
适用于解析器、验证器和视图更改侦听器的整个管道(例如
ng change

现在(Angular v1.4)没有办法使用
ngModelOptions
debounce
延迟隔离到特定验证器

但是,通过将延迟参数传递给您自己的异步验证器指令,可以轻松实现该功能:

<input ng-model="val" foo-validator="{delay: 500}">
delay
可以通过
foo validator
属性从参数中获得,可以使用隔离作用域绑定(
scope:{config:'=foovidator}
),也可以直接使用
$eval
-将属性表达式与正确的作用域绑定:

var config = $scope.$eval(attrs.fooValidator);
var delay = config.delay;

您可以始终将参数传递给指令问题不在于我无法将属性添加到指令中。问题是,在指令中,我如何在验证器上设置去盎司?然后,你相应地添加一个$timeout是的,这正是我要问的,我可以使用角度验证器而不是$timeout来完成吗;这不是一个或另一个。你认为debounce是怎样的?好的,所以没有办法直接将debounce属性应用到验证器,而不是所有的管道。我想这是一个很好的答案,即使一点也不令人满意:(无论如何,谢谢。@ThomasLeduc,对-没有办法。不管它是否令人满意,你都可以向Angular团队提出改进建议,但在我看来,对于框架来说,这将是一个太窄的用例,无法实现。你可能是对的……但它不是那么窄,这是一个基本的用例。无论如何,谢谢你的确认。
var pendingValidation;
ngModel.$asyncValidators.foo = function(modelValue, viewValue){

  if (pendingValidation) $timeout.cancel(pendingValidation);

  pendingValidation = $timeout(function(){
    pendingValidation = null;

    // returns promise or value
    return doAsyncValidation();
  }, delay);

  return pendingValidation;
};
var config = $scope.$eval(attrs.fooValidator);
var delay = config.delay;