在Angular中使用JS-Data 2.6,我正在尝试使用一个漂亮的干净URL加载数据数组,例如/报告/ 22。 (这种格式很有意义,因为它遵循业务逻辑 - 我按类别ID加载报表数据,然后返回几行。)
然而,
find
时,js-data与可怕的[Error] "attrs" must be an object!
一起死亡,因为它需要1行,否则无法说服 - 除非我遗漏了什么。findAll
时,我需要使用uglier /report/?categoryId = 22
进行搜索 - 并更改服务器/report/22/myaction
有没有办法使用find()或findAll()来
答案 0 :(得分: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#find
会这样做
GET /<resource>/:id
和DS#findAll
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
选项或相同的数组。
您有三次机会在数据到达DS#inject
之前按摩数据:
deserialize
hook 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资源一起使用
对应于数据库中的表和资源的实例对应
表中的行。生成报告通常是其中之一
您从不同的来源编辑数据,进行聚合等等
不可预测(因此,这个问题)。
这是另一种选择:
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 按照你的喜好。如果您发现任何特定的扩展或自定义 你所撰写的文章可以被概括,并使很多其他人有所帮助 相同的用例,let us know!
干杯!