Объединение ошибок на стороне сервера и на стороне клиента в ngMessage
У меня есть mdDialog, который выполняет проверку на стороне сервера при отправке. Я пытаюсь найти способ объединить сообщения об ошибках. Проблема в том, что мне нужно очищать ошибки на стороне сервера перед каждой попыткой отправки, и я не хочу вводить имя каждой возможной ошибки.
Поэтому я делаю это, назначая префикс таким кодам и очищая их вручную. Это выглядит очень смешно, хотя. Есть ли более угловой способ добавления серверных ошибок в поля $error полей, чтобы их можно было использовать с ngMessages?
Пример ответа об ошибке JSON с сервера (одно свойство для каждого ошибочного поля):
{"name":"svr_nameduplicated", "anotherfield":"svr_somethingwrong", ...}
Выдержка из диалога:
<md-dialog-content>
<div class="md-dialog-content">
<md-input-container>
<label>Name:</label>
<input type="text" name="name" data-ng-model="product.name" md-maxlength="40" required/>
<div ng-messages="productForm.name.$error" role="alert">
<div ng-message="required">Name is required.</div>
<div ng-message="md-maxlength">Name is too long.</div>
<div ng-message="svr_nameduplicated">Duplicate name.</div>
</div>
</md-input-container>
</div>
</md-dialog-content>
контроллер:
function EditProductDialogController($scope, $mdDialog, product, productIdx) {
$scope.productIdx = productIdx;
$scope.product = product;
$scope.cancel = function() {
$mdDialog.cancel();
}
$scope.save = function() {
clearServerSideErrors($scope.productForm);
if ($scope.productForm.$valid) {
var options = {headers : {'X-CSRF-TOKEN': self.csrf}};
$http.put(contextPath + '/prod/ang/update/' + product.id, product, options)
.then(function(response) {
$mdDialog.hide({product: $scope.product, productIdx: $scope.productIdx});
},
function(errResponse) {
addServerSideErrors($scope.productForm, errResponse.data);
});
}
}
}
Хакские утилитарные функции:
// walk on form fields and set errors whose code starts with svr_ to valid
function clearServerSideErrors(form) {
for (var prop in form) {
if (form.hasOwnProperty(prop) && !prop.startsWith('$')) {
for (var prop2 in form[prop].$error) {
if (prop2.startsWith('svr_')) {
form[prop].$setValidity(prop2, true);
}
}
}
}
}
// walk on error object returned from server and add errors to $error of fields
function addServerSideErrors(form, errors) {
for (var prop in errors) {
form[prop].$setValidity(errors[prop], false);
}
}