私は 3.0.0-rc.4 の js-data を使用しており、バックエンド API への 1 回の呼び出しから複数のモデルをロードする必要があります。私はまだバックエンドも構築しており、異なるエンドポイントに対して複数の呼び出しを行うのではなく、一度に異なるテーブルからすべてのデータを取得できるようにしたいと考えています。
1 に答える
あなたはできる。Web アプリがロードしようとしているルートが /posts/123 であり、2 つの異なるテーブルに存在する Post #123 とそのコメントをロードする必要があるとします。クライアント側のアプリでは、次のようなことができます
store.find('post', 123)
あるいは
store.find('post', 123, { params: { with: 'comment' } })
/post/123
これは、およびそれぞれのようなものに対して GET リクエストを行い/post/123?with=comment
ます。
バックエンドは、コメントが埋め込まれた Post レコードで応答できます。投稿とコメントの関係について 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 を使用している場合は、https://github.com/js-data/js-data-expressをチェックしてください。これにより、クエリ文字列を正しく解析し、すべての Express ルートをすべて生成できます。あなたのマッパー。js-data-express を使用すると、上記の例で示したとおり、バックエンドはリクエストに正確に応答できます。
インメモリ ストアにデータをロードすると、View コンポーネントは、表示する必要があるデータをインメモリ ストアから取得できます。
メモリ内ストアから投稿 #123 を取得します。
store.get('post', 123)
メモリ内ストアから投稿 #123 のコメントを取得します。
store.getAll('comment', 123, { index: 'post_id' })
コンポーネントを使用している場合DataStore
、投稿のコメントは投稿レコード自体でも利用できる必要がありますpost.comments
。