此答案中的所有内容都假定您使用的是 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
orafterFindAll
钩子
- 查看
cacheResponse
- 如果
true
,将afterFind
or的结果传递afterFindAll
给DS#inject
- 如果
false
,将afterFind
or的结果传递afterFindAll
给DS#createInstance
- 返回最终结果
避免注入错误的唯一方法是:
A) 不将适配器响应注入数据存储区
或者
B)在将数据传递到之前将数据按摩成正确的格式DS#inject
DS#inject
需要具有由资源选项指定的字段的对象idAttribute
或相同的数组。
您有三个机会在数据到达之前对其进行按摩DS#inject
:
- HTTP 响应拦截器
deserialize
钩子_
afterFind
或afterFindAll
钩_
在其中任何一种方法中,您都可以将数据修复为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 资源一起使用,其中 Resource 对应于数据库中的表,并且 Resource 的实例对应于表中的行。生成报告通常是您从不同来源编译数据、进行聚合等的事情之一。它不是可预测的(因此,这个问题)。
这是另一种选择:
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。如果您发现您编写的任何特定扩展或自定义都可以推广并让许多具有相同用例的其他人受益,请告诉我们!
干杯!