2012-06-14 160 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]); 
     } 
    } 
});