有哪些选项可用于解析ngResource响应中的嵌套资源?
关于在ngResource中解析嵌套资源的端点存在一些相关的问题,但是这个问题是关于REST响应何时包含嵌套在正在查询的集合中的第二个资源,特别是1到1的映射,你不愿意没有例如pets/<id>/owner
作为自己的资源。
假设有两种资源,Pets
和Owners
:
GET / pets:
[{
name: 'spark',
type: 'dog',
owner: '/owners/3/' # alternatively just '3' or the full object.
}]
作为开发人员,我有时想要查询Owner
资源,有时我想查询Pet
资源,然后我自动想要将owner
属性解析为资源实例。
这是我目前的解决方案:
.factory('Pet', function ($resource, Owner) {
var Pet = $resource('/pets/:id', {id: '@id'});
Pet.prototype.getOwner = function () {
return new Owner(this.owner); // or Owner.get({id: this.owner})
}
return Pet;
})
这里的问题很多。有诚信 - 一个人。我相信,这种实现允许同一资源的多个实例。那就是实用性。您还有其他属性可以跟踪(owner
和getOwner()
,而不仅仅是owner
;如果您希望能够保存模型,则可能setOwner
。< / p>
可以在transformResponse
上构建替代解决方案,但是在每个具有嵌套映射的资源中都包含该解决方案。
答案 0 :(得分:3)
我相信这就是Martin Gontovnikas创造Restangular的原因。他不喜欢在主角度框架中处理嵌套的$资源。我认为他的Restangular解决方案可以很好地满足您的需求。他的代码在GitHub上here,他在youtube here上有一个很好的介绍视频。
检查出来。我想你会发现它完全符合你的要求。
答案 1 :(得分:2)
更新:我最终解决了这个问题并开始了a new angular module, available on GitHub。下面的答案是关于我最初写的Gist。
那里似乎没有像我一直在寻找的东西。我已经开始实施仅支持get
和getList
(查询)操作的解决方案。其余的方法应该是微不足道的,因为我几乎与ngResource模块的布局保持一致。我的实施要点如下。
https://gist.github.com/lyschoening/7102262
资源可以作为完整对象嵌入到JSON中,完全对象只包含在正确的Resource
模型中,或者作为 URI 自动解析。除了嵌入式资源之外,该模块还支持典型的嵌套资源,可以是真正的父子集合(资源只能在选择父资源后访问),也可以作为交叉引用集合。
Yard = Resource('/yard') # resource model
Yard.$nested('trees') # embedded item or list of items
Chair = Resource('/chair')
Yard.$nested('/chair') # sub-collection without its own model
# (for many-to-many)
Tree = Resource('/tree')
# child-collection with its own model
TreeHouse = Tree.$childResource('/treehouse')
yard = Yard.get(1)
# GET /yard/1
# {
# "uri": "/yard/1",
# "trees": [
# "/tree/15", -- reference, looked-up automatically with GET
# {"uri": "/tree/16", "name": "Apple tree"}
# -- full object, resolved to Tree instance
# ]
# }
# GET /tree/16
# {"uri": "/tree/15", "name": "Pine tree"}
yard.chair.getList()
# GET /yard/1/chair
# [{"uri": "/chair/1", ...}, ..]
# -- model inferred from URI
yard.trees[0].treehouse.getList()
# GET /tree/15/treehouse
# [{"uri": "/tree/15/treehouse/1", ...}, ..]
# -- automatically resolved to TreeHouse instance