Angularjs >1.3 $validator 导致 modelValue 未定义

标签 angularjs validation angularjs-directive

我正在使用 $validator 编写自定义表单验证指令。

目前它看起来像这样:

module.directive('tweetLength', function(URLDetector) {
  return {
    restrict: 'A',
    require: 'ngModel',
    link: function(scope, element, attrs, ctrl) {
      var allowedCharacters;
      allowedCharacters = parseInt(attrs.tweetLength);

      ctrl.$validators.tweetLength = function(modelValue, viewValue) {
        var result;
        return result = URLDetector.urlAdjustedCharacterCount(modelValue) <= allowedCharacters;
      };
    }
  };
});

它检查它附加的元素的模型的字符数,同时考虑到链接缩短(所以 ng-minlengthng-maxlength 不要' 工作)。当不满足要求时,它返回 false。问题是,当它返回 false 时,modelValue 变为 undefined。我知道此时值应该存储在 $$invalidModelValue 中,但我仍然需要原始模型中的值,因为它正在 View 中的其他地方使用。

有没有办法阻止 Angular 移动它并使原始模型未定义?我知道这个问题可以在表单 Controller 中解决,但我认为这不是正确的方法,因为我想使用表单状态而不是一些外部变量来禁用表单提交按钮。在使用 Angular 表单验证时是否有其他方法可以解决此问题?

最佳答案

从 Angular v. 1.3 开始,当 $validate()返回 false,ng-model 的值设置为未定义(文档 here)

要防止此行为,请设置 ngModelOptionsallowInvalid 属性为真,像这样:

ng-model-options="{allowInvalid: true}"

关于Angularjs >1.3 $validator 导致 modelValue 未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29111328/

相关文章:

javascript - 在 HTML 和 AngularJS 中为选定的选项标签实现 ng-if 和 ng-repeat

javascript - 在打印屏幕 AngularJS 顶部获取空白

javascript - 放置在 ng-repeat 上的 Angular Directive(指令)未从 ng-repeat 中删除

javascript - HTML 数字字段 setSelectionRange 保留光标位置不起作用

javascript - angularjs - 将 XMLHttpRequest 重构为 $http

javascript - AngularJs 用户验证对每个字符发出请求

jquery验证,使字段有条件必需?

java - Hibernate 要求 javax.validation.constraints.Size 进行枚举

javascript - Angular 指令修改范围,但不在 setTimeout 之后

javascript - 在 Angular js中手动设置输入元素的焦点