我正在做提交的客户端验证,如果表单有效,我调用资源,成功一切都很好,但现在在错误处理程序上我对我的数据传输对象bean进行服务器端验证一些Hibernate验证器注释,当这些注释失败时,我返回一个带有失败字段名称和消息的json。现在我想从Angular控制器设置我的输入字段无效,但是我无法从作用域访问该表单,甚至作为我的错误回调函数中的参数。
$scope.submit = function (saleForm) {
if (saleForm.$invalid) {
return;
}
$scope.sale.$save(function (sale) {
$modalInstance.close(sale);
$scope.alerts.push({type: 'success', msg: 'Sale successfully added!'});
}, function (errors) {
for (var field in errors.data) {
$scope.saleForm.$setValidity(field, false); // <-- wrong approach?
}
})
};
我从json回来的字段名称与我网站上的字段名称相匹配。我在这做错了什么?通过循环,我想将所有返回的字段设置为无效状态。
答案 0 :(得分:3)
除了上面评论中已经提到的错误之外,您还错误地使用了$setValidity()
函数。
$setValidity
接受两个论点:
1. validationErrorKey(string)
2. isValid(布尔值)
当您将validationErrorKey的有效性设置为false
时,唯一的方法是&#34;撤消&#34;它是将同一validationErrorKey的有效性设置为true
通过致电$setValidity(false)
,您基本上会调用$setValidity('false', undefined)
,相当于$setValidity('false', false)
但是,由于没有任何内容可以为validationErrorKey true
设置'false'
的有效性,因此您的控件将永远无效。
要解决此问题,您还需要指定validationErrorKey
例如。数字字段可能无效,因为它不是数字(validationErrorKey:number
),因为它超出了最大允许值(validationErrorKey:max
),因为它是必需的并且为空( validationErrorKey:required
)等。
因此,您的服务器也应该返回validationErrorKey(例如为什么它无效),以便您可以正确使用:
saleForm[field].$setValidity(errorKey, false);