2012-10-23 33 views
0

我们仍然在这个项目中使用ExtJS 3.3,因为它是一个较老的项目,(不幸的是)我们没有时间升级。ExtJS 3.3商店:保存事件接收不完整的数据

我有一个编辑器网格面板与一个宁静的JSON商店。 JSON商店有autoSave设置为false,因为我需要在服务器上执行可能长时间运行的任务时发生了某些变化。所以我决定创建一个“保存”按钮,这样只有用户完成修改后才会保存商店。当商店向服务器发送多个请求时,我正在监听商店的save事件,以便在保存所有数据后启动另一个开始长时间运行操作的请求。

在这里,问题来了:根据文档的事件处理程序的第三个参数是已保存的数据,通过存储操作(创建,更新或毁灭)分组,像这样:

{ 
    create: [ /* created records here */ ], 
    update: [ /* updated records here */ ], 
    destroy: [ /* deleted records here */ ] 
} 

我的问题是,我只收到“创建”的记录。对于其他操作,当应该有一些记录时,该数组总是空的。如果没有使用“更新”或“销毁”的记录,data对象不包含“更新”或“销毁”键(这是正确的)。

比方说,有一个更新,二创建,并在最后没有删除的记录保存操作,我收到看起来像这样的数据:

{ 
    create: [ 
     { /* record 1 data here */ }, 
     { /* record 2 data here */ } 
    ], 
    update: [] // <-- should not be empty! 
} 

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

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

回答

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