Sencha touch Sencha Touch在iOS上的离线回退
我正在尝试使用2.2.1制作一个基本的Sencha Touch应用程序,它将在以下情况下离线工作。到目前为止,我所拥有的或多或少是一些不同字段的直接克隆,它在浏览器中工作得非常好 例如,在Chrome上,我可以看到存储在Sencha touch Sencha Touch在iOS上的离线回退,sencha-touch,sencha-touch-2,local-storage,offline-caching,cache-manifest,Sencha Touch,Sencha Touch 2,Local Storage,Offline Caching,Cache Manifest,我正在尝试使用2.2.1制作一个基本的Sencha Touch应用程序,它将在以下情况下离线工作。到目前为止,我所拥有的或多或少是一些不同字段的直接克隆,它在浏览器中工作得非常好 例如,在Chrome上,我可以看到存储在localStorage中的项目,如果我关闭计算机的互联网连接,这些项目就会被读取。但是在iOS上,我尝试将应用程序保存到主屏幕,并且在连接时效果很好。但是,一旦我将设备置于飞行模式,localStorage显示为空,我的列表显示为空 我已经尝试过使用JSON数据的本地副本,但它
localStorage
中的项目,如果我关闭计算机的互联网连接,这些项目就会被读取。但是在iOS上,我尝试将应用程序保存到主屏幕,并且在连接时效果很好。但是,一旦我将设备置于飞行模式,localStorage
显示为空,我的列表显示为空
我已经尝试过使用JSON数据的本地副本,但它似乎没有通过缓存.manifest
存储在iOS上,所以这也不是一个备用选项。有没有办法在iOS上的浏览器/主屏幕上工作?多谢各位
更新缓存的密钥控制器代码如下所示(注意,除了一些不同的型号/商店名称外,它与上面的示例相匹配):
从上面的控制台。log
调用中,我可以看到我的localStorage
在浏览器上和连接时看起来很棒,但在iOS上断开连接后就空了(尽管在桌面上仍然可以脱机)
我的离线模式是:
Ext.define('MyApp.model.OfflineTable', {
extend: 'Ext.data.Model',
config: {
fields: [
"id",
"text",
"content",
"group"
],
identifier:'uuid', // needed to avoid console warnings!
proxy: {
type: 'localstorage',
id: 'offlineTableData'
}
}
});
我的在线模式很简单
Ext.define('MyApp.model.Table', {
extend: 'Ext.data.Model',
config: {
fields: [
"id",
"text",
"content",
"group"
]
}
});
最后,我的商店是:
Ext.define('MyApp.store.Tables', {
extend: 'Ext.data.Store',
config: {
model: 'MyApp.model.Table',
proxy: {
timeout: 3000,
type: 'ajax',
url: /* DATA URL */
},
autoLoad: true
}
});
尝试从Ext.Application创建两个存储,而不是:
Ext.create('Ext.data.Store',{model:'MyApp.model.OfflineTable})
使用相同的模型,并复制在线存储(TablesRemote)加载回调上的内容:
表远程:
Ext.define('MyApp.store.TablesRemote', {
extend: 'Ext.data.Store',
config: {
model: 'MyApp.model.Table',
proxy: {
timeout: 3000,
type: 'ajax',
url: /* DATA URL */
},
autoLoad: true,
listeners: {
load: function(st, g, s, o, opts) {
var localStore = Ext.getStore('TablesLocal');
st.each(function(record) {
localStore.add(record);
localStore.sync();
});
}
}
}
});
本地:
Ext.define('MyApp.store.TablesLocal', {
extend: 'Ext.data.Store',
config: {
model: 'MyApp.model.Table',
proxy: {
type: 'localstorage'
},
autoLoad: true
}
});
然后您应该始终使用MyApp.store.TablesLocal
访问数据
希望能有所帮助-经过几个小时的调试,我终于找到了一个有效的解决方案。Sencha Touch处理
localStorage
的方式有一个完全(据我所知)未记录的细微差别。我遵循的原始示例的想法是,在线数据将同步到本地存储,以便以后以以下方式使用:
store.each(function(record) {
var rec = {
id: record.data.id,
text: record.data.text,
content: record.data.content,
group: record.data.group
};
localStore.add(rec);
localStore.sync();
});
然而,在实践中,这仅将数据本地存储在当前实例中,这与该点不符。Sencha实际上只更新浏览器的本地存储中的“脏”记录。由于我们正在创建全新的记录,它们会发出“干净”的声音。因此,为了让localStore.sync()
调用真正起作用,我们需要在上面的复制循环中弄脏记录,如下所示:
store.each(function(record) {
var myRecord = Ext.create("MyApp.model.Table", {
id: record.data.id,
text: record.data.text,
group: record.data.group,
content: record.data.content
});
myRecord.setDirty();
theStore.add(myRecord);
theStore.sync();
});
本质上,我们正在基于全局表模型创建一个“脏”记录,并将其添加到本地存储,然后本地存储将正确地同步和存储它,因为它现在是“脏”的。这将每个记录存储为一个单独的localStorage
属性,其中包含原始脱机表数据
(如我们模型的代理ID中声明的)显然是作为所有条目的ID索引。因此,您将在localStorage
中看到一大堆offlineTableData
条目,但不会;我不确定是否有办法将其浓缩,但在初始同步后,它似乎可以在飞行模式的iOS设备上工作
希望这是有意义的,快乐编码。所以我需要两家本地/在线商店?我在最初的问题中遵循的示例使用了两个模型和一个在线商店,然后在上面的控制器文件中创建了本地商店。是的,我知道。IMO的意见更好,是一种更具MVC的方式。我经常使用这种方法,从来没有遇到过任何问题,这是一个非常可控的解决方案。尝试过,但这只是一个简单的结构。我想我找到了我的问题:我对本地存储商店所做的更新实际上从未保存。Sencha仅在
sync
上同步“脏”记录。现在,我可以通过inspector查看存储在localStorage
中的数据,但我必须找出如何将其读取回来。如果要了解Sencha如何同步的问题,请参阅我关于此问题的答案,以获得全部解决方案。
store.each(function(record) {
var myRecord = Ext.create("MyApp.model.Table", {
id: record.data.id,
text: record.data.text,
group: record.data.group,
content: record.data.content
});
myRecord.setDirty();
theStore.add(myRecord);
theStore.sync();
});