我正在提交时进行客户端验证,如果表单有效,则调用资源,成功时一切都很好,但是现在在错误处理程序中,我也在我的数据传输对象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返回的字段名称与我的网络上的字段名称匹配。我在这里做错了什么?通过循环,我想将返回的所有字段都设置为无效状态。
最佳答案
除了上面的注释中已经提到的错误之外,您还错误地使用了$setValidity()
函数。$setValidity
接受两个参数:
1.validationErrorKey(字符串)
2. isValid(布尔值)
将validationErrorKey的有效性设置为false
时,“撤消”的唯一方法是将同一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);
关于javascript - 从资源错误回调中的作用域访问表单,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24477140/