2015-05-04 88 views
2

我定义了一个工厂,返回一个$resource

myApp.factory('Region', function($resource) { 
    return $resource(baseUrl + '/templates/:templateId/regions/:regionId', null, { 
     query: { 
      method: 'GET', 
      isArray: false 
     }, 
     update: { 
      method: 'PUT' 
     } 
    }); 
}); 

正如你所看到的,一个区域是一个模板的子资源,我已经定义了端点/templates/:templateId/regions/:regionId

我希望保存新区域时出现问题。如何指定templateId将区域保存到?这里是我的片断:

$scope.save = function() { 
    if ($scope.mode === 'edit') { 
     // TODO 
    } else { 
     Region.save($scope.region, function(success) { 
      $state.go('app.templateList') 
     }); 
    } 
}; 

在所有其他资源我有我刚刚用Model.save($scope.model);,我不知道如何指定其他URL参数和角文档似乎并没有掩盖它。

回答

2

根据the docs,非GET(例如PUT)方法接受以下参数

Resource.save([parameters], postData, [success], [error]). 

parameters是路径参数和它是可选的,postData - 请求的主体。如果要提供templateId,只需将其添加为第一个参数:

Region.save({templateId: 'id'}, $scope.region, function(success) { 
    $state.go('app.templateList') 
}); 
0

我已经遇到了类似的dillema。我想到了一些通用的约定要在其中创建子资源X例如,由一些资源拥有集合的新元素,易建联并没有做

POST /api/Y/<yId>/X 

然后访问X的集合由Y拥有:

GET /api/Y/<yId>/X 

然而,对于修改或删除子资源,我们可以直接访问子资源:

PUT /api/X/<xId> 
DELETE /api/X/<xId> 

达到上述我们可以使用$resource定义

Subresource = $resource('/api/:parent/:parentId/subresource/:id', 
    { id: '@id' }, 
    { 
    'update': { method:'PUT' } // this is because Angular lacks PUT support 
    }); 

那么我们就可以使用它像

var subresourceList; 
Subresource.query({parent: 'Y', parentId: parentId }, 
    function(result) { 
    // handle result here 
    subresourceList = result; 
    }); 

和修改单个子资源对象后,我们就可以使用

var subresource = subresourceList[0]; 
subresource.someProp = 'newValue'; 
subresource.$update() 

与早期子资源定义$更新将做PUT直接将它保存/api/X/<xId>只要子资源X对象被修改与其拥有Y无关,这是合理的。