2012-06-14 158 views
4

本地存储代理在Extjs 4.1中似乎相当麻烦。请告诉我我做错了什么。Extjs4 localstorage - 如何删除所有记录?

我试图(像其他人一样)从服务器加载数据,然后将其存储在本地以供离线使用。我的问题涉及刷新数据(在浏览器中重新加载)。 removeAll()不会删除任何记录。我读过,您可以通过本地存储代理本身调用clear()来清除本地存储。记录被删除时,密钥生成器不会重置。我担心这最终会导致问题。

在我的代码中,我在做什么会导致LocalStorage行为失常?我知道模型中的设置ID是正确的,但我认为我正确地做到了这一点。

这里的模型和存储:

  Ext.define('MAP.model.LookupData', { 
       extend: 'Ext.data.Model', 

       idProperty:'localId', 

       fields: [ 
        'localId', // used for storing data via a localstorage proxy. -jg 
        'name', 
        'value' 
       ] 
      }); 


      Ext.define('MAP.store.LocalCloudConditionStore', { 
       extend: 'Ext.data.Store', 
       model: 'MAP.model.LookupData', 
       storeId: 'localCloudConditionStore', 

       proxy: { 
        type: 'localstorage', 
        id : 'cloud-conditions' 
       } 

      }); 

这里的代码试图利用removeAll()清除本地存储:

offlineStore.load(); 
    offlineStore.removeAll(); 
    offlineStore.sync(); 

    Ext.each(records,function(record){ 
     var added = offlineStore.add(record.getData())[0]; 
     console.log(added.get('id')); 
    }); 

    offlineStore.sync(); 

什么地方存储代理写入到我的浏览器:

First load

而且第二次重新加载。它不删除之前的:如果我尝试使用proxy.clear()

Second load. Frist load data isn't removed.

,记录消失,但idGenerator种子不复位:

offline.getProxy().clear(); 

    Ext.data.StoreManager.register(offline); 

    Ext.each(records,function(record){ 
     var added = offline.add(record.getData())[0]; 
     console.log(added.get('id')); 
    }); 

    offline.sync(); 

the counter isn't reset!

谢谢为你的眼球。

UPDATE

我已经能够通过直接正在重置实例我localstore前值本地存储的计数器复位。很明显,这会导致保留,所以它并不理想。

window.localStorage.setItem('cloud-conditions-counter',0); 

var offline = Ext.create('MAP.store.LocalCloudConditionStore'); 

offline.getProxy().clear(); 

UPDATE DEUX

经过进一步思考,我认为这是正确的不重置计数器。当mysql中的表被截断时,您不会重置序列号。如果使用已删除记录的某个缓存标识(假设标识为1)从表中提取数据,则可能会导致问题。完全不同的记录将被返回而不是被删除的记录。好吧,有道理。

不过,为什么heck没有store.removeAll(); store.sync()工作?

+0

当在一个SQL数据库中的表被截断,引擎重置序列号,如果你删除记录,而不使用TRUNCATE语句,然后你不”重置序列。我有同样的问题,我的顾虑是因为商店不重置柜台。如果您调用store.count(),则返回正确的值。 – rernesto

回答

1

我不确定这是一个错误,但我确信removeAll()不会将记录标记为已删除,并且不会影响远程或本地存储(即以下同步不会执行任何操作)。这与remove()相反 - 实际上是这样做的。

您可以使用此方法来删除所有记录:

Ext.override(Ext.data.Store), { 

    removeAllForReal: function() { 
     records = this.data.items, 
     i = records.length; 

     while (i--) { 
      this.remove(records[i]); 
     } 
    } 
});