2016-10-11 10 views
1

私はjs-dataの3.0.0-rc.4を使用していますが、バックエンドAPIを1回呼び出すだけで複数のモデルをロードする必要があります。私はまだバックエンドを構築しており、異なるエンドポイントへの複数の呼び出しを行うのではなく、異なるテーブルからすべてのデータを一度に取得できるようにしたいと考えています。js-data複数のモデルを1つのルートで扱います

答えて

2

できます。あなたのウェブアプリケーションがロードしようとしているルートが/ posts/123で、Post#123とそのコメントをロードする必要があります。これは2つの異なるテーブルにあります。あなたのクライアント側のアプリでは、それぞれ/post/123/post/123?with=commentのようなものにGETリクエストを行います

store.find('post', 123) 

あるいは

store.find('post', 123, { params: { with: 'comment' } }) 

ような何かを行うことができます。

あなたのバックエンドは、そのコメントが埋め込まれた投稿レコードで応答できます。投稿とコメントの関係についてJSDataに伝えている限り、それぞれがメモリ内の正しい場所にキャッシュされます。たとえば:

store.defineMapper('post', { 
    relations: { 
    hasMany: { 
     comment: { 
     localField: 'comments', 
     foreignKey: 'post_id' 
     } 
    } 
    } 
}); 
store.defineMapper('comment', { 
    relations: { 
    belongsTo: { 
     post: { 
     localField: 'post', 
     foreignKey: 'post_id' 
     } 
    } 
    } 
}); 

あなたは実行します。

store.find('post', 123) 

あなたのバックエンドがで応答:

{ 
    "id": 123, 
    // ... 
} 

あなたが実行します。

store.find('post', 123, { params: { with: 'comment' } }) 

あなたのバックエンドがで応答します

{ 
    "id": 123, 
    // ..., 
    comments: [ 
    { 
     "id": 14323, 
     "post_id": 123, 
     // ... 
    }, 
    // ... 
    ] 
} 

バックエンドでNode.js + JSDataを使用している場合は、照会文字列を正しく解析し、すべてのマッパーのすべてのExpressルートを生成することができます。https://github.com/js-data/js-data-expressをチェックしてください。 js-data-expressを使用すると、上記の例で示したように、バックエンドは要求に正確に応答できます。

あなたは、メモリ内ストアにデータをロードしたら、それは、メモリ内の店舗の外に表示するために必要なデータを引き出すことができ、あなたのビューコンポーネント:

、メモリ内のうち、ポスト#123を取得します店舗:

store.get('post', 123) 

は、メモリ内店舗のうち、ポスト#123のコメントを取得します。

store.getAll('comment', 123, { index: 'post_id' }) 

あなたがDataStoreコンポーネントを使用している場合は、ポストのコメント寿投稿記録自体にも利用可能です。 post.comments

+0

素晴らしい回答!私はまだフォローアップの質問を持っています。したがって、js-dataは、この例のストレージオブジェクトは「コメント」ですが、受信したネストされたフィールドは「コメント」なので、受信したデータから複数のものを解決するには十分スマートですか? – jredd

+1

JSDataは、リレーション定義の "localField"設定により、どのフィールドが埋め込まれたリレーションかを認識します。 – jdobry

関連する問題