ngResource解析嵌套资源

时间:2013-10-16 14:42:08

标签: angularjs angularjs-resource

有哪些选项可用于解析ngResource响应中的嵌套资源?

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

假设有两种资源,PetsOwners

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

这里的问题很多。有诚信 - 一个人。我相信,这种实现允许同一资源的多个实例。那就是实用性。您还有其他属性可以跟踪(ownergetOwner(),而不仅仅是owner;如果您希望能够保存模型,则可能setOwner。< / p>

可以在transformResponse上构建替代解决方案,但是在每个具有嵌套映射的资源中都包含该解决方案。

2 个答案:

答案 0 :(得分:3)

我相信这就是Martin Gontovnikas创造Restangular的原因。他不喜欢在主角度框架中处理嵌套的$资源。我认为他的Restangular解决方案可以很好地满足您的需求。他的代码在GitHub上here,他在youtube here上有一个很好的介绍视频。

检查出来。我想你会发现它完全符合你的要求。

答案 1 :(得分:2)

更新:我最终解决了这个问题并开始了a new angular module, available on GitHub。下面的答案是关于我最初写的Gist。

那里似乎没有像我一直在寻找的东西。我已经开始实施仅支持getgetList查询)操作的解决方案。其余的方法应该是微不足道的,因为我几乎与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