gpt4 book ai didi

javascript - 如果多个元素使用相同的自定义验证指令,如何验证表单?

转载 作者:行者123 更新时间:2023-11-28 07:08:52 25 4
gpt4 key购买 nike

我已经为这种格式的日期编写了一个验证指令MM/YYYY,如果我每页只有一个元素要验证,那么它会很好用,但是当我有多个元素时,我注意到验证是混合的,因此可能是一个范围误解。

我的意思是我收到 form.startDate 元素的 minDate 验证错误,而不是只看到 form.endDate 的错误。

这是我的观点:

<form>
<input id="start-date"
type="text"
validate-short-date
data-max-date="{{endingDate | toDate:'MM/YYYY':'YYYYMM'}}"
data-greater-date="{{nextMonth | toDate:'MM/YYYY':'YYYYMM'}}"
name="startDate"
data-ng-model="startingDate">

<input id="end-date"
type="text"
validate-short-date
data-min-date="{{thisMonth | toDate:'MM/YYYY':'YYYYMM'}}"
name="endDate"
data-ng-model="endingDate">
</form>

我想使用scope[ngModel.$name],但问题仅部分得到解决,所以我可能错过了如何使用范围来保持指令的划分。

这是指令:

.directive('validateShortDate', ['moment', function(moment) {
return {
restrict: 'A',
require: 'ngModel',
link: function(scope, element, attr, ngModel) {

var pattern, regex;
pattern = '^((0[0-9])|(1[0-2])|[1-9])\/(19|20)[0-9]{2}$';
regex = new RegExp(pattern, 'i');

var isEmpty = function(modelValue){
return modelValue === '' || modelValue === null || angular.isUndefined(modelValue);
};

var toDate = function(modelValue){
return moment(modelValue, 'MM/YYYY').format('YYYYMM');
};

scope[ngModel.$name] = {};
scope[ngModel.$name].maxDate = false;
scope[ngModel.$name].minDate = false;
scope[ngModel.$name].greaterDate = false;
scope[ngModel.$name].lesserDate = false;

attr.$observe('maxDate', function() {
if (!isEmpty(attr.maxDate)) {
scope[ngModel.$name].maxDate = attr.maxDate;
ngModel.$validate();
}
});

attr.$observe('greaterDate', function() {
if (!isEmpty(attr.greaterDate)) {
scope[ngModel.$name].greaterDate = attr.greaterDate;
ngModel.$validate();
}
});

attr.$observe('minDate', function() {
if (!isEmpty(attr.minDate)) {
scope[ngModel.$name].minDate = attr.minDate;
ngModel.$validate();
}
});

attr.$observe('lesserDate', function() {
if (!isEmpty(attr.lesserDate)) {
scope[ngModel.$name].lesserDate = attr.lesserDate ;
ngModel.$validate();
}
});

ngModel.$validators.maxDate = function(modelValue) {
console.log(ngModel.$name);
var maxDate = scope[ngModel.$name].maxDate;
if (!isEmpty(modelValue) && !isEmpty(maxDate) && regex.test(modelValue)) {
return toDate(modelValue) <= maxDate;
}
return true;
};

ngModel.$validators.greaterDate = function(modelValue) {
var greaterDate = scope[ngModel.$name].greaterDate;
if (!isEmpty(modelValue) && !isEmpty(greaterDate) && regex.test(modelValue)) {
return toDate(modelValue) < greaterDate;
}
return true;
};

ngModel.$validators.minDate = function(modelValue) {
var minDate = scope[ngModel.$name].minDate || false;
if (!isEmpty(modelValue) && !isEmpty(minDate) && regex.test(modelValue)) {
return toDate(modelValue) >= minDate;
}
return true;
};

ngModel.$validators.lesserDate = function(modelValue) {
var lesserDate = scope[ngModel.$name].lesserDate;
if (!isEmpty(modelValue) && !isEmpty(lesserDate) && regex.test(modelValue)) {
return toDate(modelValue) > lesserDate;
}
return true;
};

ngModel.$validators.valid = function(modelValue) {
return isEmpty(modelValue) || regex.test(modelValue);
};
}
};
}])

如何在同一 View 中保留更多验证指令?

最佳答案

您的怀疑是正确的,这是一个范围界定问题。您希望对这些指令有一个独立的范围。查看this blog post关于这个主题的一个很好的分解。关于您的代码,请尝试以下更改...

.directive('validateShortDate', ['moment', function(moment) {
return {
restrict: 'A',
scope: {}, // -- isolate - not shared with parent scope
require: 'ngModel',
link: function(scope, element, attr, ngModel) {
[...]

此外,如果您希望这些属性作为命名范围属性,本文还介绍了实现此目的的技术。这应该可以减轻您当前将 scope[ngModel.$name] 的解决方法简化为指令中的 scope.name 的问题。这将被视为这样......

scope: {
'name': '='
[...] // -- other attributes to be named on scope
}

还可以探索博客中的用法,了解如何使用 @ 字符与 = 传递 {{ interpolated }} 值范围。简单地说...

  • @ Used to pass a string value into the directive
  • = Used to create a two-way binding to an object that is passed into the directive
  • & Allows an external function to be passed into the directive and invoked

关于javascript - 如果多个元素使用相同的自定义验证指令,如何验证表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31478139/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com