0

Angular で JS-Data 2.6 を使用して、きれいな URL (/report/22 など) を使用してデータの配列をロードしようとしています。(この形式は理にかなっています。ビジネス ロジックに従っているためです。カテゴリ ID でレポート データを読み込んで、いくつかの行を取得しています。)

でも、

  • 私が使用するfindと、js-data[Error] "attrs" must be an object!は1行を期待しているため、恐ろしいもので死にます。何かが欠けていない限り、それ以外の場合は納得できません。
  • を使用するときはfindAll、uglier を使用して検索し/report/?categoryId = 22、サーバーを変更する必要があります
  • アクションを使用すると、URIにアクション名が追加されますが、これは必要ありません。/report/22/myaction

find() または findAll() を使用する方法はありますか

  • きれいな URL を持っている
  • データの配列をロードする
  • できれば、サーバーの実装を変更しないでください
4

1 に答える 1

1

この回答のすべては、HTTP アダプターを使用していることを前提としています。

JSData のデフォルトの期待値は次のとおりです。

  • GET /<resource>/:idオブジェクトを返します。{ id: 1 }
  • GET /<resource>オブジェクトの配列を返します。[{ id: 1 }, { id: 2 }]
  • POST /<resource> { some: 'field' }データベースに単一のアイテムを作成し、更新されたアイテムを返します。{ id: 1, some: 'field' }
  • PUT /<resource>/:id { updated: 'field' }データベース内の単一のアイテムを更新し、更新されたアイテムを返します。{ id: 1, updated: 'field' }
  • PUT /<resource> { updated: 'field' }データベース内のアイテムのコレクションを更新し、更新されたアイテムを返します。たとえば、データベースから単一のアイテムを削除し[{ id: 1, updated: 'field' }, { id: 2, updated: 'field' }] ますDELETE /<resource>/:id
  • DELETE /<resource>データベースからアイテムのコレクションを削除します

デフォルトでは、 DS#finddoes GET /<resource>/:idおよびDS#findAlldoes GET /<resource>です。

サーバーからの応答は、 に到達するまでに適切な形式になっている必要がありますDS#inject

これらの呼び出しのライフサイクルは次のとおりです。

  1. アダプターの 呼び出しfindまたはメソッドfindAll
    1. GETアダプタの呼び出し方法
    2. HTTPアダプタの呼び出し方法
    3. deserializeサーバー応答でメソッドを呼び出す
  2. アダプタの応答をafterFindまたはafterFindAllフックに渡す
  3. 小切手cacheResponse
    1. の場合、またはの結果をtrue渡すafterFindafterFindAllDS#inject
    2. の場合、またはの結果をfalse渡すafterFindafterFindAllDS#createInstance
  4. 最終結果を返す

インジェクション エラーを回避する唯一の方法は、次のいずれかです。

A) アダプターの応答をデータストアに挿入しない

また

B)データが渡される前に、データを正しい形式にマッサージしますDS#inject

DS#injectidAttributeリソースのオプションで指定されたフィールドを持つオブジェクト、または同じ配列のいずれかが必要です。

に到達する前に、データを処理する機会が 3 つありますDS#inject

  1. HTTP 応答インターセプター
  2. deserializeフック_
  3. afterFindorafterFindAllフック_

これらの方法のいずれかで、データを期待どおりに修正できますDS#inject

できるようにしたい場合は、次のようにしReport.find(22)ます。

var Report = store.defineResource({
  name: 'report',
  afterFind: function (Report, data, cb) {
    cb(null, {
      id: 22,
      data: data
    });
  }
});

Report.find(22).then(function (report) {
  report.id; // 22
  report.data; // [{...}, {...}]
});

これはすべて、実際に を使用できるようにしたいことを前提としていますDS#findDS#findDS#findAllリソースがデータベース内のテーブルに対応し、リソースのインスタンスがテーブル内の行に対応する RESTful リソースで使用することを意図しています。通常、レポートの生成は、さまざまなソースからデータをコンパイルしたり、集計を行ったりする作業の 1 つです。それは予測可能ではありません (したがって、この質問です)。

別のオプションは次のとおりです。

var Report = store.defineResource({
  name: 'report',

  /* Static Class Methods */
  findByCategoryId: function (id) {
    // Use the adapter directly
    return Report.getAdapter('http').find(Report, id).then(function (data) {
      // Inject the result into the store
      return Report.inject({
        id: 22,
        data: data
      });
    });
  }
});

Report.findByCategoryId(22). then(function (report) {
  return Report.findByCategoryId(23);
}).then(function (report) {
  Report.filter(); // [{...}, {...}]
});

基本的に、特定のタスクを達成するには多くの方法があり、それぞれに長所と短所があります。JSData は、デフォルト設定で非常に多くのユースケースにのみ一般化できます。

JSData のパワーを解き放ち、生産性を最大化するには、JSData を好みに合わせて成形できる JSData の多くのオプションとフックに注意する必要があります。あなたが作成した特定の拡張機能またはカスタマイズが一般化され、同じユースケースを持つ他の多くの人に利益をもたらす可能性があることがわかった場合は、お知らせください

乾杯!

于 2015-10-30T03:41:51.837 に答える