2013-10-16 6 views
7

ngResourceレスポンスでネストされたリソースを解決するためのオプションはありますか?ngResourceネストされたリソースを解決する

ngResourceのネストされたリソースのエンドポイント解決に関するいくつかの関連する質問がありましたが、この質問は、REST応答にクエリ中のコレクションにネストされた2番目のリソース、特に1対1のマッピング例えば持っていないだろうpets/<id>/ownerをそれ自体のリソースとして使用します。

GET /ペット:開発者として

[{ 
    name: 'spark', 
    type: 'dog', 
    owner: '/owners/3/' # alternatively just '3' or the full object. 
}] 

、私は時々、時々私がしたい、全体としてOwnerリソースを照会する

は2つのリソース、PetsOwnersがあると言います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で構築することができますが、ネストされたマッピングを持つすべてのリソースにそれを含めるにはハック感があります。

答えて

3

Martin GontovnikasがRestangularを作成した理由はこれが正しいと思います。彼は主な枠組みの中で入れ子になった$資源を扱わなければならないのが好きではなかった。私は彼のRestangularソリューションがあなたのニーズにうまく収まると思います。彼のコードはGitHub hereにあり、彼はyoutube hereに素晴らしいイントロビデオを持っています。

私はそれがあなたがしたいことを正確にしていると思うでしょう。

+3

だから、あなたがRestangularで何ができるか、.one( '所有者') 'Restangular.one(1 'ペット')を呼び出している。get()は'とすることをロードし、 '/ペット/ 1/owner'私は、それぞれの所有者が '/所有者/'からしかアクセスできないようにするために、それぞれのリソースに対して1つの固有のエンドポイントがあるというパラダイムを探していますが、同時に、異なる所有者の応答にオブジェクトを埋め込むことも可能ですリソース。 – lyschoening

+0

長方形の方法は次のようになります: 'pet.owner = Restangular.restangularizeElement(ペット、ペット所有者、 '所有者')'。 – lyschoening

+0

これは本当に「ネストされた」リソースではなく、単に2つの依存リソースに似ているようです。 「ネストされた」とは、一方が他方から導かれる(ある導出されたURLを意味する)ことを意味する。お互いに依存する2つの別々のリソース(「ペット」と「所有者」)を持つことは異なります。バックエンドサービスにアクセスできますか?バックエンドが他の依存関係をあらかじめ設定しておくと、依存関係が改善されるようですが、それは可能ではないかもしれません。 – tennisgent

2

更新:私は少しこれで作業を終え、a new angular module, available on GitHubを開始しました。以下の答えは、私が元々書いた傑作です。

私が探していたもののようにそこには何もないようです。 getgetListクエリ)の操作のみをサポートするソリューションの実装を開始しました。残りのメソッドは、ngResourceモジュールのレイアウトを維持しているので、追加するのは簡単ではありません。私の実装のGistは以下の通りです。

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 
+0

角度モジュールはどこですか?あなたはそれを削除しましたか? – bruno

+0

@bruno [link](https://github.com/biosustain/angular-potion)を修正しました。それはjson-refsに依存するので元のコメントとまったく同じではありません。私は現在、これをさらに維持していません。角度2のTypeScriptで書き直す予定です。[Flask-Potion](https://github.com/biosustain/potion)で使用するように設計されています。リファレンス解決ロジックの中核については、[this gist](https://gist.github.com/lyschoening/a9e94a3fc77ae571df63)を参照してください。 – lyschoening

関連する問題