2015-06-28 47 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實例。