在资源错误回调的范围内访问表单

Accessing form from scope inside resource error callback

本文关键字:访问 访问表 表单 范围内 资源 错误 回调      更新时间:2023-09-26

我在提交时做客户端验证,如果表单有效,我调用资源,成功一切都很好,但现在在错误处理程序上,我在数据传输对象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中得到的字段名与我的web上的字段名匹配。我哪里做错了?使用循环,我想将返回的所有字段设置为无效状态。

除了上面评论中已经提到的错误之外,您还错误地使用了$setValidity()函数。

$setValidity接受两个参数:
1. validationErrorKey(字符串)
2. isValid(布尔)

当您将validationErrorKey的有效性设置为false时,"撤销"它的唯一方法是将相同的validationErrorKey的有效性设置为true
通过调用$setValidity(false),您实际上调用了$setValidity('false', undefined),相当于$setValidity('false', false)
但是,由于没有任何东西将validationErrorKey 'false'的有效性设置为true,因此您的控件将永远无效。

要解决这个问题,还需要指定validationErrorKey。
例如,一个数字字段可能是无效的,因为它不是一个数字(validationErrorKey: number),因为它超过了最大允许值(validationErrorKey: max),因为它是必需的和空(validationErrorKey: required)等。

因此,你的服务器也应该返回validationErrorKey(例如,为什么它是无效的),所以你可以正确地使用:
saleForm[field].$setValidity(errorKey, false);