【发布时间】: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(),都会返回正确的值。