7

ngResource 応答でネストされたリソースを解決するためのオプションは何ですか?

ngResource でネストされたリソースのエンドポイントを解決することに関するいくつかの関連する質問がありましたが、この質問は、REST 応答にクエリ対象のコレクションにネストされた 2 番目のリソースが含まれている場合、特に 1 対 1 のマッピングがない場合に関するものです。たとえばpets/<id>/owner、独自のリソースとして。

2 つのリソースがある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;
})

ここでの問題はたくさんあります。1 つには、誠実さがあります。この実装により、同じリソースの複数のインスタンスが可能になると思います。あとは実用性。また、追跡する追加の属性もあります (モデルを保存できるようにする場合は、単に;の代わりにownerおよび)。getOwner()ownersetOwner

代替ソリューションを に構築することもできますtransformResponseが、ネストされたマッピングを持つすべてのリソースにそれを含めるのはハックのように思えます。

4

2 に答える 2

3

これこそが、Martin Gontovnikas が Restangular を作成した正確な理由だと思います。彼は、メインの angular フレームワークでネストされた $resources を処理する必要がありませんでした。彼の Restangular ソリューションは、あなたのニーズにうまく適合すると思います。彼のコードはこちらのGitHubにあり、YouTube のこちらの素敵な紹介ビデオがあります。

見てみな。あなたがやりたいことを正確に実行できることがわかると思います。

于 2013-10-16T15:11:47.657 に答える
2

更新:私はこれに少し取り組んでしまい、GitHub で利用可能な新しい角度モジュールを開始しました。以下の回答は、私が最初に書いた Gist に関するものです。

私が探していたようなものは周りにないようです。getand getList( query ) 操作のみをサポートするソリューションの実装を開始しました。残りのメソッドは簡単に追加できるはずです。これは、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 に答える