我们仍然在这个项目中使用ExtJS 3.3,因为它是一个较旧的项目,并且(不幸的是)我们目前没有时间进行升级。
我有一个带有宁静的JSON商店的编辑器网格面板。 JSON存储的autoSave
设置为false
,因为当需要更改时,我需要在服务器上执行可能长时间运行的任务。所以我决定创建一个“保存”按钮,这样只有在用户完成修改后才能保存商店。当商店向服务器发送多个请求时,我正在监听商店的save
事件,以便在保存所有数据后启动长时间运行操作的另一个请求。
问题出现了:根据文档,事件处理程序的第三个参数是已保存的数据,按存储操作(创建,更新或销毁)分组,如下所示:
{
create: [ /* created records here */ ],
update: [ /* updated records here */ ],
destroy: [ /* deleted records here */ ]
}
我的问题是我只收到“已创建”的记录。对于其他操作,当应该有一些记录时,数组总是为空。如果没有使用“update”或“destroy”的记录,data
对象不包含“update”或“destroy”键(这是正确的)。
假设在上次保存操作中有一个更新,两个已创建且未删除的记录,我收到的数据将如下所示:
{
create: [
{ /* record 1 data here */ },
{ /* record 2 data here */ }
],
update: [] // <-- should not be empty!
}
我不知道为什么update
和destroy
总是空的。任何人都可以帮助我吗?
或者您可能有另一个建议我如何解决原始问题,使用所有已创建/更新/删除记录的ID执行“保存后”任务。
答案 0 :(得分:0)
我设法解决了这个问题。
显然beforesave
事件会收到正确的参数。我现在将脏记录存储在商店的临时属性中,然后保存它们,然后在save
事件中读取属性。
listeners: {
beforesave: function (store, data) {
// in my concrete case it's okay to join all records
var all = (data.create || []).concat(data.update || []).concat(data.destroy || []);
store.tempData = all;
},
save: function (store) {
// do something with store.tempData
}
}
由于tempData
中的记录是引用,因此在调用beforesave
时它们可能是幻像记录(没有服务器生成的ID)并不重要。调用save
时,这些记录已被“真实”记录替换。