我正在提交时进行客户端验证,如果表单有效,则调用资源,成功时一切都很好,但是现在在错误处理程序中,我也在我的数据传输对象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/

10-12 14:14