我在点击时动态添加了字段。
addNewFiled() {
let parent = this;
this.scope.fields.push({
key: 'field-'+parent.scope.fields.length,
type: 'horizontalInput',
templateOptions: {
placeholder :'Enter Field',
label: 'Filed',
required: false
},
validators: {
fieldFormat: function($viewValue, $modelValue, scope) {
let value = $viewValue;
if(value.length != 12){
scope.to.message = "Field should be 12 characters";
return false;
}
return true;
}
}
});
}
我需要的是验证输入的值不在验证器的另一个字段中,我尝试循环遍历模型,但效率不高,任何帮助都表示赞赏。
答案 0 :(得分:1)
我曾遇到过这种情况,我用2张地图解决了这个问题 基本上,你将有2个映射,一个将包含映射到它的值的字段的索引,第二个映射将包含映射到该值的重复次数的字段的值 在验证器中,您减少前一个值的重复次数(在完成其他验证之后),并增加新值的重复次数,并检查它是否超过1,然后重复它。
在对话框中定义两个地图
private valuesMap: any = [];
private keysArray:any = [];
在您的字段中,您注入一个控制器以保存当前字段的索引
controller: function ($scope) {
$scope.index = parent.scope.fields.length-1;
parent.keysArray[$scope.index] = $scope.index;
},
然后在验证器中
if(value) {
if(angular.isDefined(parent.valuesMap[parent.keysArray[scope.index]])) {
parent.valuesMap[parent.keysArray[scope.index]]= parent.valuesMap[parent.keysArray[scope.index]] -1;
}
parent.keysArray[scope.index] = value;
if(angular.isDefined(parent.valuesMap[value]) && parent.valuesMap[value] > 0) {
parent.valuesMap[value] = parent.valuesMap[value]+1;
scope.to.message = "Value is already entered";
return false;
}
parent.valuesMap[value] = 1;
}
希望这适用于你的场景
答案 1 :(得分:-1)
您不需要验证器,已经通过templateOptions中的minlength和maxlength属性对字段长度进行了默认验证。
只需这样做:
templateOptions: {
placeholder :'Enter Field',
label: 'Filed',
required: false,
minlength: 12,
maxlength: 12
},