0

我正在尝试做的事情:

让用户能够在本地存储数据,直到他决定全部上传。为此,我将表单中的数据填充到模型中,然后使用该模型填充存储(同步)。这家商店有一个本地存储代理。
离线商店.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'
        }
    ...

问题:

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

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

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

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

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

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

4

2 回答 2

2

终于从Sencha 论坛找到了解决我的问题的方法:设置record.phantom = true

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

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

于 2012-07-09T15:28:23.453 回答
0

当您说您“将数据从表单填充到模型中”时,我猜这两个商店都会获取该数据,因为它们都绑定到该模型。您究竟在什么时候检查在线商店并查看表单数据?它会在表单内的每次击键时更新吗?

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

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

  • 覆盖sync函数和过滤数据- 您可以添加模型属性submitted并覆盖商店的同步方法以仅同步具有submitted===true. 因此,您在本地拥有存储中的所有数据,但仅将批准的数据项传输到服务器。

  • 相同的商店对象- 您是否碰巧以不同的名称拥有相同的商店对象?您正在定义具有不同 ID 的不同商店,但您是否检查过它们实际上是不同的?听起来他们现在随时都会持有相同的数据?!

让我知道这是否有帮助。

于 2012-07-06T10:28:01.340 回答