【发布时间】:2015-07-29 23:04:24
【问题描述】:
好的,这就是交易。
我为input 标签创建了一个自定义指令,并为input[type=ip] 提供了自定义验证:
.directive('input', function($q, $timeout) {
return {
restrict: "E",
require: 'ngModel',
link: function(scope, elm, attrs, ctrl) {
if (attrs.type !== 'ip') return;
var reg = new RegExp("^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$");
ctrl.$asyncValidators.ip = function(modelValue, viewValue) {
if (ctrl.$isEmpty(modelValue)) {
return $q.when();
}
var def = $q.defer();
if(reg.exec(modelValue)) {
def.resolve();
} else {
def.reject();
}
return def.promise;
};
}
};
});
这非常有效,我计划在未来使用它来创建自定义验证。
我遇到的问题是input[type=file]。在视图中,它没有ngModel 属性。 Angular 不喜欢这样。从技术上讲,它是一个input 标记,因此它解释了input 指令……但这需要ngModel 属性。
我该如何解决这个问题?如何基于type 属性创建不会相互破坏的自定义input 指令?
我可以以某种方式选择require: 'ngModel' 吗?
【问题讨论】:
-
是的~
require: '?ngModel'。见docs.angularjs.org/api/ng/service/$compile#-require- -
@Phil 在这种情况下
ctrl不会为空吗?并且不会有执行验证的控制器,因此不能附加验证器? -
请注意,使用异步验证器的原因是什么?此验证是人工异步进行的
-
是的,但这不是您想要的吗?
标签: javascript angularjs