【问题标题】:angular $resource receive extra informationangular $resource 接收额外信息
【发布时间】:2015-07-22 22:47:05
【问题描述】:

我正在使用 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),它可以工作,但我无法发送消息。

我不从客户端生成消息而是从服务器获取消息的原因是,错误消息来自服务器,我希望成功消息与错误消息保持一致。

还有其他优雅的方式来发送消息吗?

【问题讨论】:

  • 在客户端,你需要将消息和响应数据一起存储,还是你一直对消息做同样的事情? (比如记录它)
  • 我向用户显示消息,例如“更新成功”。我可以从客户端创建它,但由于错误消息来自服务器,我更喜欢从服务器获取成功消息

标签: angularjs ngresource


【解决方案1】:

假设所有您的服务器响应遵循以下格式:

{ 
    data: {/*...*/},
    message: 'some message'
}

您可以为此使用$http's 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;
}

然后您可以将此函数添加到您应用的config$http 的默认转换中:

angular.module("yourApp",[/* ... */])
    .config(function($httpProvider){
        //....all your other config

        $httpProvider.defaults.transformResponse.unshift(transform);
    });

现在来自 $http 的所有响应都被此函数转换,触发 processMessage 并为您留下返回对象的 ngResource 实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-23
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 2012-07-30
    相关资源
    最近更新 更多