4

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

4

1 回答 1

1

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

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

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

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

        while (i--) {
            this.remove( records[i] );
        }
    }
});
于 2012-07-04T23:59:41.057 回答