存储同步问题

时间:2012-07-06 10:00:25

标签: javascript extjs sencha-touch-2

我正在尝试做什么:

让用户能够在本地存储数据,直到他决定全部上传数据。为实现这一目标,我将表单中的数据填充到模型中,然后使用此模型填充商店(同步)。这个商店有一个本地存储代理 offlineStore.js

Ext.define('blahblah.store.offlineStore',{
extend:'Ext.data.Store',
config:{
    model:'blahblah.model.myModel',
    id: 'offlineRegisterStore',
    sorters:'xyz',
    grouper:function(record){
        return record.get('xyz')[0];
    },
    proxy: {
        type: 'localstorage',
        id: 'offlineRegisterStoreid'
    }
 ...

现在,当用户按下同步按钮时,我将数据从此脱机存储复制到另一个具有执行REST调用的代理的商店:
OnlineStore

   Ext.define('blahblah.store.upStore', {
     extend: 'Ext.data.Store',
     config: {
        model: 'blahblah.model.myModel',
        id: 'abc',
        sorters: 'xyz',
        grouper: function (record) {
          return record.get('xyz')[0];
        },
        proxy: {
        type: 'rest',
        url: HOST,
        headers: HEADERS,
        reader: {
            type: 'json'

        },
        writer: {
            type: 'json'
        }
    ...

问题:

不幸的是,在我从离线商店添加数据后,我的在线商店甚至没有执行store.sync()。因此,不会进行REST调用。我意识到当商店没有同步数据时会发生这种情况。这很奇怪,因为在从离线商店向其中复制数据之前,我没有向在线商店添加任何内容。

我创建后立即在在线商店上做了console.log。我看到这个商店已经填写了表单数据。而且,我猜这就是为什么sync()没有被执行的原因,因为我将这些相同的数据添加回来,只是这次,来自离线商店。我对这个在线商店如何以及从何处获取数据感到困惑 在我将离线商店中的任何内容添加到在线商店之前,我还尝试了store.removeAll(),但它对商店内容没有任何影响。

告诉您是否需要查看更多代码。

编辑1 :我如何填充离线商店 - 我创建了我的模型实例,填写表单数据并执行offlineStore.add(myModel)。在此之后我做offlineStore.sync()。这就是我用模型填充模型的方法:

var myModel = Ext.create('blahblah.model.myDataModel',{  
    datafield1 = formdata1,
    datafield2 = formdata2
});  

我在什么时候查看在线商店:
当用户点击表单的提交按钮时,我获取离线商店和创建在线商店。令人惊讶的是,我只是观察到,不仅是在线商店,甚至离线商店都有我getStore时的表单数据。所以基本上数据甚至在我对它们执行sync()或添加数据填充模型之前就进入了离线和在线商店?这让我更加困惑。

2 个答案:

答案 0 :(得分:2)

最后通过Sencha forums:设置record.phantom = true找到了我的问题的解决方案。

在将记录添加到在线商店(从离线商店)之前,我执行了上面的代码。现在,当商店同步时,它认为新添加的记录确实是新记录,因此执行了POST请求。

我还必须补充一点,如果您改为设置record.dirty = true,那么商店会发送PUT请求而不是POST。

答案 1 :(得分:0)

如果您说“将表格中的数据填充到模型中”,我猜两个商店都会获得该数据,因为它们都绑定到该模型。您到底在什么时候检查在线商店并查看表单数据?是否在表单内的每次击键时都会更新?

关于如何解决这个问题的一些想法:

  • 没有Ext.data.Store离线数据 - 您可能希望将数据存储在完全独立的结构中,直到用户提交它为止,某种自定义表单支持对象而不是离线商店。这可能意味着复制模型的某些部分,但肯定有一种方法可以防止这种情况(例如在其他地方定义字段并使用它们扩展ExtJS模型和自定义对象)。

  • 覆盖sync功能并过滤数据 - 您可以添加模型属性submitted并覆盖商店的同步方法,以仅同步具有{{{ 1}}。因此,在本地,您拥有商店中的所有数据,但只将已批准的数据项传输到服务器。

  • 同一商店对象 - 您是否恰好以不同的名称拥有相同的商店对象?您正在定义具有不同ID的不同商店,但您是否检查过它们实际上是不同的?听起来他们现在可以随时保留相同的数据吗?!

如果有帮助,请告诉我。