2013-06-22 60 views
2

我正在構建一個由Node.js/Mongodb應用程序支持的Angular應用程序。從服務器獲取Angular工廠中新創建資源的ID

每個資源的id由Mongodb在創建資源時生成。

之後I POST我的新對象從工廠到服務器,服務器返回一個201響應代碼,並將位置標頭設置爲新資源的URI。我如何處理回覆,然後用正確的id更新記錄?

angular.module('myApp.Todoservices',['ngResource']). 
factory('Todo',function($resource){ 
    return $resource('http://localhost\\:3000/todos/:id', {id:'@_id'}, { 
     getAll: {method:'GET', isArray:true}, 
     update : {method:'PUT'}, 
     create : {method:'POST'}, 
     delete : {method:'DELETE'} 
    }); 
}); 
+0

後不服務器返回與新創建的記錄太(您可以在其中找到新創建的記錄的ID )? – callmekatootie

+0

@callmekatootie據我所知,正確的響應是「201 Created」,其中Location頭指向新資源。請參閱http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.30。我會編輯我的問題來澄清。 – John

回答

1

正如前面所說,這不是支持$resource,我不知道爲什麼。不過,這是我的解決方法。

var tmpPart = new MyResource({name: $scope.item.name}); 
tmpPart.$create(function(_tmpPart, responseHeaders){ 
    $resource(responseHeaders("Location")).get(function(tempResourceObject){ 
     $scope.myResourceObjects.push(new MyResource(tempResourceObject)) 
    }); 
}); 

哪裏new MyResource(tempResourceObject)是你的資源對象的新實例,你可以做你想做的事情不管。

0

$ resource service是底層$ http服務的高級包裝。的$資源方法

成功和錯誤回調(post()put()get(),...)收到包含一個headers()方法的響應對象。

有了這個方法,你能要麼得到所有響應頭的數組或者,如果你提供一個特定的頭名作爲參數,獲取特定的頭值:

var successCallback = function(response){ 
    var location = response.headers('location'); 
    // extract resource ID form the location header here... 
} 

$scope.todo.post(data, successCallback); 

$ HTTP頭getter函數描述於$http docs

0

我使用「角度資源」:「1.3.11」,它看起來很簡單。與角資源文件,根據:

類對象或實例對象上的操作方法可被調用 使用以下參數:

HTTP GET「類」動作:Resource.action([參數] [成功], [錯誤])

非GET 「類」 動作:Resource.action([參數], POSTDATA,[成功],[錯誤])

非GET實例操作:$ action([parameters],[success],[error])

成功回調是 用(value,responseHeaders)參數調用。

使用(httpResponse)參數調用錯誤回調。

todo.save(postData, 
     function (value, responseHeaders) { 
      $scope.id = responseHeaders('Location').split('/').pop(); 
     } 
); 
1

您可以自定義一個覆蓋默認$資源服務。 抱歉的CoffeeScript和NG-分類

class Resource extends Factory 
    constructor: ($resource, $http) -> 
    return class ResourceFactory extends $resource 
     constructor: (url, paramDefaults, actions, options)-> 
     class Res extends super 
      $save: (params, success, error)=> 
      super(
       params 
      , (response, responseHeaders)=> 
       if location = responseHeaders("Location") 
       $http 
       .get(location) 
       .then (httpResponse)-> 
        success new Res httpResponse.data, responseHeaders 
       , error 
       else 
       success response, responseHeaders 
      , error 
      ) 

     return Res 

Users = Resource '/users' 
user = new Users name:'foo' 
user.$save (savedUser)-> 
    savedUser # will be created from data loaded from location header of post response