javascript - 将 Angular 验证指令与 Breeze 一起使用会阻止任何无效输入

标签 javascript angularjs validation angularjs-directive breeze

如果您将任何用于验证的 Angular Directive(指令)(ng-minlength、ng-maxlength、ng-pattern 等)添加到绑定(bind)到 breeze 实体的输入,如果发现无效,它会阻止任何用户输入。

如果来自 ng-model 的值最初是有效的,它会显示出来,但是如果您将值更改为无效的值,输入字段将被清除,模型将设置为 null,并且您不能输入任何最初可能是无效的。但是,如果您将有效值复制到它显示的字段中。

如果模型值不清除输入然后阻止更改,那么在无效时将模型值设置为空这一事实我会很好。

另外我有一种感觉,不管是什么原因导致了这个问题,也搞砸了 ui-mask。如果没有 Angular 验证指令,同样的事情也会发生。

这是我从类似问题中发现的一个 Plunker,我修改它以显示我的问题: http://plnkr.co/edit/dVsF7GFY65a30soLL5W8?p=preview


编辑

经过许多小时的研究,我确实找到了一个有效的解决方案,尽管我不确定是否有任何不良副作用。

它首先与 Angular 如何通过将 $modelValue 设置为 'undefined' 进行验证有关,因为它在通过 $parsers 和 $formatters 时无法通过任何验证器。

我在 Angular 中找到了这段代码(第 16331 行),它被每个 Angular 验证器调用:

function validate(ctrl, validatorName, validity, value){
  ctrl.$setValidity(validatorName, validity);
  return validity ? value : undefined;
}

我将其更改为返回“值”而不是“未定义”:

function validate(ctrl, validatorName, validity, value){
      ctrl.$setValidity(validatorName, validity);

      return value;
    }

Angular 仍然正确设置验证。虽然我确信这不是最好的解决方案,甚至不是一个好的解决方案。

我怀疑当 Angular 将 $modelValue 设置为“undefined”然后 Breeze 发现模型已更改并更新实体时出现问题,实体随后更新模型,然后清除输入等等......或类似的东西。 ..

我发现这对我的探索很有帮助。也许这对你们中比我了解得多的人会有所帮助https://github.com/angular/angular.js/issues/1412

最佳答案

Angular 1.3.0-rc.1 引入了与 ngModelOptions 指令一起使用的 allowInvalid 选项。它本质上是 OP 在第 16331 行的 hack 的形式化。该选项指示 Angular 允许将无效表单输入写入 $scope,并巧妙地解决了问题。

用法:

<input type="email" ng-model-options="{allowInvalid: true}" ng-model="my_breeze_model.email"/>

有关更多信息,请参阅此功能请求:https://github.com/angular/angular.js/issues/8290 .

关于javascript - 将 Angular 验证指令与 Breeze 一起使用会阻止任何无效输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22694415/

相关文章:

javascript - Javascript 在运行时修改函数

javascript - 为什么不将包含 Express.js 代码的 .js 文件包含到 HTML 文件中?

javascript - 在 AngularJS 应用程序中将 URL 作为 $routeParam 传递

javascript - 无法编写基本的 Controller AngularJS

c++ - 如何检查文件是否为有效的 HDF5 文件?

javascript - 在 javascript 中设置时捕获 HTML 错误输入验证(显示警告)或之前检查验证

javascript - 使用内置验证在 Magento 中验证按钮单击/选择

javascript - Redis数据操作

javascript - HTML5多图选择限制及编辑

javascript - 嵌套 $http 调用 $q.all 返回 promise 但未解决