2015-06-28 43 views
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-资源的实例了,所以我不能做$ scope.article进一步要求,即这将导致错误,因为$ scope.article是一个普通的JSON对象:

  $scope.article.$update(function(response) {...}) 

如果我从服务器只是return res.json(article),它的工作原理,但我不能沿着发送消息。

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

有没有其他优雅的方式发送消息?

+0

在客户端上,您是否需要将消息与响应数据一起存储,或者您是否始终对消息做同样的事情? (如记录日志) – LionC

+0

我向用户显示消息,如'更新成功'。我可以从客户端创建它,但由于错误消息来自服务器,我更愿意从服务器获取成功消息 – OMGPOP

回答

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的默认transfroms:

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

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

现在从$http所有repsonses得到转化通过这个函数,触发processMessage并让你返回一个返回对象的ngResource实例。