この回答のすべては、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#find
does
GET /<resource>/:id
およびDS#findAll
does
GET /<resource>
です。
サーバーからの応答は、 に到達するまでに適切な形式になっている必要がありますDS#inject
。
これらの呼び出しのライフサイクルは次のとおりです。
- アダプターの
呼び出し
find
またはメソッドfindAll
GET
アダプタの呼び出し方法
HTTP
アダプタの呼び出し方法
deserialize
サーバー応答でメソッドを呼び出す
- アダプタの応答を
afterFind
またはafterFindAll
フックに渡す
- 小切手
cacheResponse
- の場合、またはの結果を
true
渡すafterFind
afterFindAll
DS#inject
- の場合、またはの結果を
false
渡すafterFind
afterFindAll
DS#createInstance
- 最終結果を返す
インジェクション エラーを回避する唯一の方法は、次のいずれかです。
A) アダプターの応答をデータストアに挿入しない
また
B)データが渡される前に、データを正しい形式にマッサージしますDS#inject
DS#inject
idAttribute
リソースのオプションで指定されたフィールドを持つオブジェクト、または同じ配列のいずれかが必要です。
に到達する前に、データを処理する機会が 3 つありますDS#inject
。
- HTTP 応答インターセプター
deserialize
フック_
afterFind
orafterFindAll
フック_
これらの方法のいずれかで、データを期待どおりに修正できます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#find
がDS#find
、DS#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 の多くのオプションとフックに注意する必要があります。あなたが作成した特定の拡張機能またはカスタマイズが一般化され、同じユースケースを持つ他の多くの人に利益をもたらす可能性があることがわかった場合は、お知らせください。
乾杯!