我在提交时进行客户端验证,如果表单有效,我调用资源,成功后一切都很好,但现在在错误处理程序上我也在我的数据传输对象 bean 上进行服务器端验证,其中有一些 Hibernate 验证器注释,当这些注释失败时,我返回一个带有失败字段名称和消息的 json。现在我想将我的输入字段从我的 Angular Controller 设置为无效,但我无法从范围访问表单,甚至无法作为错误回调函数中的参数。
$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 返回的字段名称与我的网站上的字段名称相匹配。我在这里做错了什么?通过循环,我想将所有返回到无效状态的字段设置为无效状态。
最佳答案
除了上面评论中已经提到的错误之外,您还错误地使用了 $setValidity()
函数。
$setValidity
接受两个参数:
1.validationErrorKey(字符串)
2. isValid( bool 值)
当您将validationErrorKey的有效性设置为false
时,“撤消”它的唯一方法是将同一validationErrorKey的有效性设置为true
。
通过调用 $setValidity(false)
您实际上是在调用 $setValidity('false', undefined)
,它相当于 $setValidity('false', false)
。
但是,由于没有任何东西可以将validationErrorKey 'false'
的有效性设置为true
,因此您的控件将永远无效。
要解决这个问题,您还需要指定validationErrorKey。
例如。数字字段可能无效,因为它不是数字 (validationErrorKey: number
),因为它超出了最大允许值 (validationErrorKey: max
),因为它是必需的并且空(validationErrorKey:必需
)等
因此,您的服务器还应该返回validationErrorKey(例如为什么它无效),以便您可以正确使用:
saleForm[field].$setValidity(errorKey, false);
关于javascript - 从资源错误回调内的范围访问表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24477140/