@goodnickoff

AngularJS: Отмена перезаписи значений объекта $resource после вызова save();

var User = $resource( 
  'http://test/index.php'
);

var user = User.get({id:'1'}); 
// GET: http://test/index.php?id=1
// server returns: { "login":"foo", "name":"bar", "mail":"baz"	}

user.name = "qux";
user.$save();
 // POST: http://test/index.php?id=1
 // server returns: { "login":"foo", "name":"bar", "mail":"qux"}


В данном случае при вызове метода save() свойства объекта user будут заменены теми, что пришли с сервера.

Но если сервер отвечает например так:
{
  "errors":{
     "login":"too short",
     "name":"is already using that name.",
     "mail":"invalid email."
  }
}


Свойства объекта user затрутся и вместо них будет свойство errors содержащее эти самые ошибки.

Есть ли способ изменить поведение $resource? Хотелось бы проверить статус ответа, и уже на основании этого решить обновлять ли свойства объекта или сообщить пользователю об ошибке.
  • Вопрос задан
  • 3107 просмотров
Решения вопроса 1
Если вы не хотите возвращать статус ошибки с сервера, то можно перехватить ответ и отклонить его (reject) в случае наличия признака ошибки (поле errors в вашем случае). Всё есть в документации (см. actions.interceptor).
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
AMar4enko
@AMar4enko
Может быть мимо кассы, конечно, но я в свое время отказался от $resource в пользу Restangular. На порядок более гибкий инструмент.
Посмотрите, может быть вам понравится.
Ответ написан
Комментировать
maxaon
@maxaon
$resource является крайне простой оберткой. Вижу два решения:
1. При ошибке сервер должен выставлять правильный код ответа 400 или 500. Далее вы должны самостоятельно провести обработку в методе $promise.catch
2. Написание своей обертки. Или использование других библиотек, но вероятнее всего придется удовлетворить первое условие, поскольку оно необходимо для нормального функционирования REST.
Ответ написан
Комментировать
@goodnickoff Автор вопроса
Хотелось бы использовать статус 200 для всех ответов сервера. А об ошибке сообщать в теле ответа. Например как у Facebook:
HTTP Status Code: 200
{"type" : "OauthException", "message":"(#803) Some of the aliases you requested do not exist: foo.bar"}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы