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

Posted

技术标签:

【中文标题】Extjs4 localstorage -- 如何删除所有记录?【英文标题】:Extjs4 localstorage -- How to Remove All records? 【发布时间】:2012-06-14 14:36:16 【问题描述】:

本地存储代理似乎在 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();

本地存储代理写入我的浏览器的内容:

第二次重新加载确实如此。它不会删除以前的:

如果我尝试使用 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();

感谢您的关注。

更新

我已经能够通过在实例化我的本地存储之前直接重置值来重置本地存储的计数器。显然,这超出了预订范围,因此并不理想。

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

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

offline.getProxy().clear();

更新 DEUX

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

不过,为什么 store.removeAll(); store.sync() 不起作用?

【问题讨论】:

当SQL数据库中的表被截断时,引擎会重置序列id,如果你删除了没有使用TRUNCATE语句的记录,那么你不会重置序列。我有同样的问题,我担心的是因为商店没有重置柜台。无论如何调用 store.count(),都会返回正确的值。 【参考方案1】:

我不确定这是一个错误,但我确信removeAll() 不会将记录标记为已删除,并且不会影响远程或本地存储(即,后续同步不会做任何事情)。这与 remove() 形成鲜明对比 - 实际上是这样做的。

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

Ext.override(Ext.data.Store),  

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

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

【讨论】:

以上是关于Extjs4 localstorage -- 如何删除所有记录?的主要内容,如果未能解决你的问题,请参考以下文章

Extjs4:如何从 HTMLElement 获取组件?

如何从 Extjs4 中的商店获取字段类型?

Extjs4 - 如何从商店的第一条记录中获取价值

如何在 extjs4 中使用 tpl 显示嵌套的 json

如何在 extjs4 中更改 fieldLabel 样式

如何在 Extjs4 表单中填写 HtmlEditor xtype