Javascript AngularJs:在数组输入上使用$setValidity
我正在使用AngularJs 1.2。我对$SETVALITY有问题 我有一个带有ng repeat的表单输入:Javascript AngularJs:在数组输入上使用$setValidity,javascript,angularjs,validation,Javascript,Angularjs,Validation,我正在使用AngularJs 1.2。我对$SETVALITY有问题 我有一个带有ng repeat的表单输入: <div ng-repeat="(key, value) in addition_page"> <input ng-model="addition_page[key].name" name="pagename[{{key}}]" not-duplicated="1"> </div> 我试图记录: console.log(scope["f
<div ng-repeat="(key, value) in addition_page">
<input ng-model="addition_page[key].name" name="pagename[{{key}}]" not-duplicated="1">
</div>
我试图记录:
console.log(scope["finish_form"]["pagename[0]"]) => return undefined
console.log(scope["finish_form"]["pagename[{{key}}]"]) => return last input
我检查了浏览器上的元素,页面名[0]存在
我需要帮助
谢谢大家
更新:
.directive('notDuplicated', [function() {
return {
require: 'ngModel',
link: function(scope, elem, attr, ngModel) {
var val_id = attr.notDuplicated;
var setValidity = function(value) {
if (value === "") return true;
var same_now = [];
var same_past = [];
angular.element("[not-duplicated=" + val_id + "]").each(function(k, v) {
if (angular.element(v).val() === value) {
same_now.push(k);
}
if (ngModel.$modelValue !== "" && angular.element(v).val() === ngModel.$modelValue) {
same_past.push(k);
}
})
// mark old input is valid
if (same_past.length === 1) {
scope["finish_form"]["pagename[" + same_past[0] + "]"].$setValidity('not-duplicated', true);
}
// mark new inputs is invalid
if (same_now.length > 1) {
same_now.each(function(k) {
scope["finish_form"]["pagename[" + k + "]"].$setValidity('not-duplicated', false);
});
return false;
}
return true;
}
//For DOM -> model validation
ngModel.$parsers.unshift(function(value) {
var valid = setValidity(value);
return valid ? value : undefined;
});
//For model -> DOM validation
ngModel.$formatters.unshift(function(value) {
setValidity(value);
return value;
});
}
};
}]);
发生这种情况是因为在
ngModelController
的实例化过程中检索控件的名称(它在其父窗体上注册的名称),发生在预链接阶段*(因此还没有插值)
如果检查myForm
的属性,就会发现所有输入都注册为“pagename[{{key}}]”
查看以获得更详细的解释和可能的解决方案(使用额外的指令)。您在哪里执行此操作:“范围[“完成表单”][“页面名[0]”]。$setValidity('not-duplicated',false);“?您是否在自定义验证指令的链接函数中执行此操作?是否在自定义验证指令的链接函数中执行此操作?=>是的。在ngModel内部。$parsers.unshift和ngModel。$formatters.unshiftmmm,你能分享剩下的代码吗?我附加了我的指令。看看这个。谢谢。对于ngModelController,名称插值
{{}
不起作用。请看ng form指令。@LêTrầnTiếnTrung:很高兴知道:)也可以随意选择另一个答案,让其他人知道它对你的问题有帮助。
.directive('notDuplicated', [function() {
return {
require: 'ngModel',
link: function(scope, elem, attr, ngModel) {
var val_id = attr.notDuplicated;
var setValidity = function(value) {
if (value === "") return true;
var same_now = [];
var same_past = [];
angular.element("[not-duplicated=" + val_id + "]").each(function(k, v) {
if (angular.element(v).val() === value) {
same_now.push(k);
}
if (ngModel.$modelValue !== "" && angular.element(v).val() === ngModel.$modelValue) {
same_past.push(k);
}
})
// mark old input is valid
if (same_past.length === 1) {
scope["finish_form"]["pagename[" + same_past[0] + "]"].$setValidity('not-duplicated', true);
}
// mark new inputs is invalid
if (same_now.length > 1) {
same_now.each(function(k) {
scope["finish_form"]["pagename[" + k + "]"].$setValidity('not-duplicated', false);
});
return false;
}
return true;
}
//For DOM -> model validation
ngModel.$parsers.unshift(function(value) {
var valid = setValidity(value);
return valid ? value : undefined;
});
//For model -> DOM validation
ngModel.$formatters.unshift(function(value) {
setValidity(value);
return value;
});
}
};
}]);