我正在使用AngularJs 1.2。我遇到了$ setValidity的问题。
我有一个带有ng-repeat的表单输入:
<div ng-repeat="(key, value) in addition_page">
<input ng-model="addition_page[key].name" name="pagename[{{key}}]" not-duplicated="1">
</div>
现在我需要在某些指定输入上使用$ setValidity,但是我失败了
scope["finish_form"]["pagename[0]"].$setValidity('not-duplicated', false);
我试着记录:
console.log(scope["finish_form"]["pagename[0]"]) => return undefined
console.log(scope["finish_form"]["pagename[{{key}}]"]) => return last input
我在浏览器上检查了元素,pagename [0]已经存在。
我需要帮助,PLZ。
谢谢大家。
更新
.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;
});
}
};
}]);
答案 0 :(得分:1)
这是因为在ngModelController
的实例化期间检索了控件的名称(在其父表单上注册的名称), according to the docs 发生在预连接阶段*之前(所以还没有插值)。
如果您检查myForm
的属性,您会发现所有输入都已注册为“pagename [{{key}}]”。
请查看 this answer 以获取更详细的说明和可能的解决方案(使用额外指令)。