angular $ resource получает дополнительную информацию

0

Я использую 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) с сервера, он работает, но я не могу отправить сообщение.

Причина, по которой я не генерирую сообщение от клиента, но извлечение из сервера - это сообщение об ошибке с сервера, я хочу сохранить сообщение об успешности, соответствующее сообщению об ошибке.

Есть ли другой элегантный способ отправить сообщение?

Теги:
ngresource

1 ответ

1
Лучший ответ

Предполагая, что все ваши ответы серверов следуют этому формату:

{ 
    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 возвращаемого объекта.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню