保存子资源有角的$资源
问题描述:
我定义了一个工厂,返回一个$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参数和角文档似乎并没有掩盖它。
答
根据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')
});
答
我已经遇到了类似的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无关,这是合理的。