我有一个模特和一个商店。我使用此处记录的set(field,value)
方法更新记录:API - Set。更新字段后,我使用此处记录的save()
方法:API - Save。
绑定到商店且的任何列表中的记录更新似乎已保存,但是当我重新加载网页时旧值显示。因此记录被更新,商店看到新数据,绑定到商店的列表刷新它们的显示,但是localstorage中数据的实际表示永远不会更新。如果您使用浏览器控制台查找和检查var record = summaryStore.getAt(4)
之类的项目,即使尚未进行dirty
调用,您也会发现save()
属性为false。此外,无论summaryStore.getUpdatedRecords()
方法是否已被调用,save()
都会返回一个空集。
var summaryStore = new Ext.data.Store({
model: 'EventSummary',
storeId: 'summaryStore',
sortOnLoad: true,
sorters: [
{
property: 'date',
direction: 'DESC'
}
],
proxy: {
type: 'localstorage',
id : 'summary-cache'
}
})
Ext.regModel('EventSummary', {
fields: [
{name: 'child', type: 'string'},
{name: 'date', type: 'date'},
{name: 'description', type: 'string'},
{name: 'event_id', type: 'int'}
],
proxy: summaryStore.proxy
})
var record = summaryStore.findExact('event_id', 90)
record.date = new Date();
record.description = 'Vitamin K Shot`
record.save()
之前的和 record.save()
之后的,dirty
标志为false。 summaryStore.getUpdatedRecords()
在之前返回,在之后返回空集。无论记录是否已保存,所有汇总商店列表都会反映所做的更改。
使用此调用填充商店,该调用遵循商店和模型的声明。 summaryStore.load()
答案 0 :(得分:1)
上面提到的setDirty变通方法对我不起作用,但我找到了另一种将记录保存到WebLocalStorage代理的解决方法:
record.set('field1', 'abc');
store.proxy.setRecord(record);
我正在使用1.1.1。 (顺便说一下,由于某种原因,我不能调用save();例外情况说我需要一个url,这不适用于weblocalstorage。)
答案 1 :(得分:0)
使用商店中的sync()方法将数据持久保存到localstorage。
尝试使用此代码而不是上面的示例:
var record = summaryStore.findExact('event_id', 90)
record.set('date', new Date());
record.set('description', 'Vitamin K Shot`);
record.save();
summaryStore.sync();
答案 2 :(得分:0)
<强>更新强>
通过在将模型实例传递给商店的add
方法之前正确实例化,可以完全避免该问题。我只是传递JSON,商店接受了,但显然是造成问题。
结束更新
可以通过在 WebStorageProxy.js
中进行更改来解决此问题请注意,更改此文件不会修改sencha-touch.js文件。您必须重建它或直接修改它
此代码无效
setRecord: function(record, id) {
if (id) {
record.setId(id);
} else {
id = record.getId();
}
由于某种原因,这一行特别是id = record.getId();
在已经添加到商店的对象上未定义。解决方案是添加
if (id === undefined) {
id = record.internalId;
}
最终代码看起来像
setRecord: function(record, id) {
if (id) {
record.setId(id);
} else {
id = record.getId();
if (id === undefined) {
id = record.internalId;
}
}