Я использую ng-resource для выполнения запроса ajax. Я хочу отправить дополнительную информацию, кроме данных.
Например, у меня есть объект статьи на моем сервере
exports.fetchArticle = function(req, res, next) {
var article = req.article
return res.json({data: article, message: 'success fetch article'})
}
Причина, по которой я заключаю это, заключается в том, что в случае удаления нет смысла отправлять данные, я могу просто return res.json({data: null, message: 'deleted successfully'})
на моей стороне клиента у меня есть:
$scope.fetchArticle = function() {
Article.get({articleId: $routeParams.articleId}, function(response) {
$scope.article = response.data
$scope.ajaxSuccess = response.message
}, function(err) {
$scope.ajaxError = err.data.message
})
}
$ scope.article больше не является экземпляром ng-resource, поэтому я не могу выполнить дальнейший запрос с $ scope.article, т.е. это вызовет ошибку, так как $ scope.article - это простой json-объект:
$scope.article.$update(function(response) {...})
Если я просто return res.json(article)
с сервера, он работает, но я не могу отправить сообщение.
Причина, по которой я не генерирую сообщение от клиента, но извлечение из сервера - это сообщение об ошибке с сервера, я хочу сохранить сообщение об успешности, соответствующее сообщению об ошибке.
Есть ли другой элегантный способ отправить сообщение?
Предполагая, что все ваши ответы серверов следуют этому формату:
{
data: {/*...*/},
message: 'some message'
}
Вы можете использовать $http
transformResponse
для этого, чтобы вы получили экземпляр ngResource, который является вашим возвращенным объектом, все еще обрабатывая ваше сообщение. Для этого вам нужна функция преобразования:
function processMessage(data, message) {
//Do whatever you want with your message here, like displaying it
}
function transform(response) {
processMessage(response.data,response.message);
var data = response.data;
delete response.data;
delete response.message;
for(var attributeName in data) {
response[attributeName] = data[attributeName];
}
return response;
}
Затем вы можете добавить эту функцию в $http
default transfroms в config
вашего приложения:
angular.module("yourApp",[/* ... */])
.config(function($httpProvider){
//....all your other config
$httpProvider.defaults.transformResponse.unshift(transform);
});
Теперь все репсоны из $http
преобразуются этой функцией, запуская processMessage
и оставляя вас с экземпляром ngResource возвращаемого объекта.