2013-09-30 55 views
4

所以我定義爲資源如下:

angular.module('questionService', ['ngResource']) 
.factory('QuestionService', function($http, $resource) { 
    var QuestionService = $resource('/api/questions/:key', {}, { 
     query: { 
      method:'GET', 
      isArray:true, 
     }, 
     save: { 
      method: 'POST', 

     } 
    }); 

    return QuestionService 
}); 

,後來我採取某種形式的輸入並執行以下

var newQ = { 
    txt: $scope.addTxt 
}; 

QuestionService.save(newQ) 

服務器通過重新發布對象的JSON並使用新的唯一ID設置位置標題來響應POST請求。問題在於Angular沒有保存將返回的JSON或位置標題返回到對象中,並且未使用來自服務器的ID設置以供將來操作。我試過了很多東西,例如:

transformResponse: function(data, headersGetter) { 
    locationHeader = headersGetter().location; 
    key = locationHeader.split('/').slice(-1)[0]; 
    data.key = key; 
    return data; 
} 

但是,返回的數據項目似乎沒有得到使用。我錯過了什麼嗎?這似乎是用於與REST API進行交互的非常常見的用例。

謝謝!

回答

3

你需要有一個成功的處理程序,以新的ID分配給手動newQ

QuestionService.save(newQ, function(data) { 
    newQ.id = data.id; 
}); 

但是有一個更好的實現是相同的。因爲你QuestionService是資源類的對象,你可以實例化newQ這樣的:

var newQ = new QuestionService({text: $scope.addTxt}); 

然後,調用$save()newQ的:

newQ.$save(); 

現在newQ應該由服務器返回的新ID。

+0

謝謝!甚至沒有意識到這個語法是可用的。 – grivescorbett

+0

有什麼辦法可以防止$ save覆蓋資源和響應?例如,我有一個用戶資源$ scope.user。如果我調用$ scope.user。$ save()並且服務器以「Success」響應,ng-resource會將$ scope.user設置爲單詞「Success」。有沒有辦法來防止這種情況?我的後端只是返回新用戶的ID,我想在成功回調中手動更新:$ scope.user.id = response.id,我不希望將整個用戶對象返回在迴應中。 – parliament

0

我有WebApi2 Asp.Net服務器上運行,我使用確定(數)返回的內容,並將其返回例如「6」作爲結果。一旦它返回,角度顯示包含承諾和狀態的對象,原型和深層重複的層次結構,但沒有價值,不是'6'。 所以我去看看數據的去向,看數據是在哪裏定義一個變換,我看到了兩個數據,但它不是一個JSON ...

後來我改變它以下,現在我在我的成功函數中有一個obj,它具有名爲'returnValue'的子屬性(如我所定義的),並且此對象保留了我的值。

transformResponse: function(data, header){ 
    var obj={}; 
    obj.returnValue=angular.fromJson(data); 
    return obj; 
},