我正在使用 $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-minlength
和 ng-maxlength
不要' 工作)。当不满足要求时,它返回 false。问题是,当它返回 false 时,modelValue
变为 undefined
。我知道此时值应该存储在 $$invalidModelValue
中,但我仍然需要原始模型中的值,因为它正在 View 中的其他地方使用。
有没有办法阻止 Angular 移动它并使原始模型未定义
?我知道这个问题可以在表单 Controller 中解决,但我认为这不是正确的方法,因为我想使用表单状态而不是一些外部变量来禁用表单提交按钮。在使用 Angular 表单验证时是否有其他方法可以解决此问题?
最佳答案
从 Angular v. 1.3 开始,当 $validate()
返回 false,ng-model
的值设置为未定义(文档 here)
要防止此行为,请设置 ngModelOptions
的 allowInvalid
属性为真,像这样:
ng-model-options="{allowInvalid: true}"
关于Angularjs >1.3 $validator 导致 modelValue 未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29111328/