ExtJS 3.3存储:保存接收不完整数据的事件

时间:2012-10-23 08:16:44

标签: javascript events extjs store extjs3

我们仍然在这个项目中使用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执行“保存后”任务。

1 个答案:

答案 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时,这些记录已被“真实”记录替换。