7

有哪些选项可以解决 ngResource 响应中的嵌套资源?

关于解析 ngResource 中嵌套资源的端点存在一些相关问题,但这个问题是关于何时 REST 响应包含嵌套在正在查询的集合中的第二个资源,尤其是您不会拥有的一对一映射例如pets/<id>/owner作为自己的资源。

假设有两个资源,Pets并且Owners

获取/宠物:

[{
  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;
})

这里的问题很多。有诚信——一方面。我相信,这种实现允许同一资源的多个实例。然后是实用性。您还可以使用其他属性来跟踪(ownergetOwner(),而不仅仅是owner;setOwner如果您希望能够保存模型,则可能)。

可以在transformResponse.

4

2 回答 2

3

我相信这就是 Martin Gontovnikas 创建 Restangular 的确切原因。他不喜欢在主要的 Angular 框架中处理嵌套的 $resources。我认为他的 Restangular 解决方案非常适合您的需求。他的代码在 GitHub 上,他在 youtube 上有一个不错介绍视频。

一探究竟。我想你会发现它完全符合你的要求。

于 2013-10-16T15:11:47.657 回答
2

更新:我最终在这方面做了一些工作,并开始了一个新的 Angular 模块,可在 GitHub 上找到。下面的答案是关于我最初写的 Gist。

那里似乎没有任何像我一直在寻找的东西。我已经开始实施仅支持getgetList查询)操作的解决方案。剩下的方法应该很容易添加,因为我几乎一直使用 ngResource 模块的布局。我的实施要点如下。

https://gist.github.com/lyschoening/7102262

资源可以作为简单地包装在正确Resource模型中的完整对象或作为自动解析的URI嵌入到 JSON 中。除了嵌入式资源外,该模块还支持典型的嵌套资源,既可以作为真正的父子集合(其中资源只有在选择父资源后才能访问),也可以作为交叉引用的集合。

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
于 2013-10-22T15:12:00.623 回答