本地存储代理似乎在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();
感谢你的眼球。
更新
我可以通过在实例化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()
工作?
答案 0 :(得分:1)
我不确定这是一个错误,但我确信removeAll()
没有将记录标记为已删除,也不会影响远程或本地存储(即,以下同步不会执行任何操作) 。这与remove()
形成鲜明对比 - 实际上是这样做的。
您可以使用此方法删除所有记录:
Ext.override(Ext.data.Store), {
removeAllForReal: function() {
records = this.data.items,
i = records.length;
while (i--) {
this.remove( records[i] );
}
}
});