1

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

4

1 に答える 1

2

あなたはできる。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

于 2016-10-16T16:37:05.680 に答える