【问题标题】:ExtJS 3.3 Store: save event receiving incomplete dataExtJS 3.3 Store:保存接收不完整数据的事件
【发布时间】:2012-10-13 03:08:01
【问题描述】:

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

【问题讨论】:

    标签: javascript events extjs store extjs3


    【解决方案1】:

    我设法解决了这个问题。

    显然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 时,这些记录已经被“真实”记录替换了。

    【讨论】:

      猜你喜欢
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多