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

时间:2014-06-29 14:46:00

标签: javascript jquery json angularjs

我正在做提交的客户端验证,如果表单有效,我调用资源,成功一切都很好,但现在在错误处理程序上我对我的数据传输对象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回来的字段名称与我网站上的字段名称相匹配。我在这做错了什么?通过循环,我想将所有返回的字段设置为无效状态。

1 个答案:

答案 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);