0

我们在这个项目中仍在使用 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!
}

我不知道为什么updatedestroy总是空着。谁能帮我?

或者,也许您有另一个建议,我可以如何解决原始问题,使用所有创建/更新/删除记录的 ID 执行“保存后”任务。

4

1 回答 1

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是引用,因此在调用时它们可能是幻像记录(没有服务器生成的 ID)并不重要beforesave。调用时save,这些记录已经被“真实”记录替换。

于 2012-10-23T14:11:09.220 回答