Extjs4 localstorage - 如何删除所有记录?

时间:2012-06-14 14:36:17

标签: local-storage extjs4.1

本地存储代理似乎在Extjs 4.1中相当错误。请告诉我,我做错了。

我正在尝试(像其他人一样)从服务器加载数据,然后将其存储在本地以供离线使用。我的问题涉及刷新数据(在浏览器中重新加载)。 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

第二次重装确实如此。它不会删除先前的:

Second load.  Frist load data isn't removed.

如果我尝试使用proxy.clear(),记录就会消失,但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!

感谢你的眼球。

更新

我可以通过在实例化localstore之前直接重置该值来重置本地存储的计数器。显然,这取消了预订,所以它并不理想。

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

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

offline.getProxy().clear();

更新DEUX

经过进一步反思,我认为不重置计数器是正确的。当截断mysql中的表时,不会重置序列号。如果使用已删除记录的某些缓存ID(比如id为1)来从表中提取数据,则可能会出现问题。将返回完全不同的记录而不是已删除的记录。好的,有道理。

仍然,为什么heck不store.removeAll(); store.sync()工作?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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