我在Sencha Touch和本地存储方面遇到了一些问题......
1)我能够将数据保存到localstorage中,并且在我刷新页面之前它很有效。在那之后,我仍然可以访问数据,似乎进行更改,甚至添加新条目。但是一旦刷新页面,我的所有更新都会消失。新添加的任何内容都可以,但原始条目的更新将不会保存(希望这是有道理的)。基本上,我可以创建一个条目,并在我刷新页面之前将其全部更新。此时它不会再次保存到localstorage。新条目总是保存得很好。
2)当我删除条目的所有条目然后刷新页面时,我在控制台中收到此错误:“未捕获的TypeError:无法读取null的属性'id'”。看起来它正试图加载一些东西,即使没有任何东西。我不确定为什么它会在这种情况下抛出错误,而不是在页面最初加载时因为它应该是同样的事情呢?
型号:
Ext.regModel('inventoryItem', {
idProperty: 'id',
fields: [
{ name: 'id', type: 'int' },
{ name: 'date', type: 'date', dateFormat: 'c' },
{ name: 'title', type: 'string' },
{ name: 'quantity', type: 'int' },
{ name: 'size', type: 'int' },
{ name: 'cost', type: 'double' },
{ name: 'startDate', type: 'date' },
{ name: 'endDate', type: 'date' },
{ name: 'dailyAvgCost', type: 'string' },
{ name: 'dailyAvgSize', type: 'string' }
]
});
商品
Ext.regStore('inventoryItemsStore', {
model: 'inventoryItem',
sorters: [{
property: 'id',
direction: 'DESC'
}],
proxy: {
type: 'localstorage',
id: 'inventory-app-store'
},
getGroupString: function (record) {
return '';
}
});
处理程序:
{
var currentinventoryItem = CostsApp.views.inventoryEditor.getRecord();
CostsApp.views.inventoryEditor.updateRecord(currentinventoryItem);
var inventoryStore = CostsApp.views.inventoryList.getStore();
if (null == inventoryStore.findRecord('id', currentinventoryItem.data.id))
{
inventoryStore.add(currentinventoryItem);
}
inventoryStore.sync();
inventoryStore.sort([{ property: 'date', direction: 'DESC'}]);
CostsApp.views.inventoryList.refresh();
}
有人能指出一些明显我做错的事吗?
答案 0 :(得分:3)
我有同样的问题,我将代理移动到模型中,这解决了我的问题。您修改的代码应如下所示:
型号:
Ext.regModel('inventoryItem', {
idProperty: 'id',
fields: [
{ name: 'id', type: 'int' },
{ name: 'date', type: 'date', dateFormat: 'c' },
{ name: 'title', type: 'string' },
{ name: 'quantity', type: 'int' },
{ name: 'size', type: 'int' },
{ name: 'cost', type: 'double' },
{ name: 'startDate', type: 'date' },
{ name: 'endDate', type: 'date' },
{ name: 'dailyAvgCost', type: 'string' },
{ name: 'dailyAvgSize', type: 'string' }
],
proxy: new Ext.data.LocalStorageProxy({
id: 'inventory-app-store'
})
});
商店:
Ext.regStore('inventoryItemsStore', {
model: 'inventoryItem',
sorters: [{
property: 'id',
direction: 'DESC'
}],
getGroupString: function (record) {
return '';
}
});
答案 1 :(得分:1)
对我来说,商店同步()已经证明非常棘手,这可能会有所帮助。
.sync()
不会更新远程o localstorage记录,除非它们是脏的。所以他们不会坚持不懈。
使用json类型的阅读器很容易犯下直接修改记录的错误,必须使用Model的方法来执行此操作,特别是.set()
,因为 set()定义了记录为“脏”,然后 sync()才会实际保存更改。
使用本地存储调试尤其困难。
对于以下商店:
Ext.define('MyApp.store.LocalStuff',{
extend: 'Ext.data.Store',
xtype:'localstuff',
config: {
fields:['stuffId','stuffName','stuffArray'],
storeId:'LocalStuffId',
autoLoad:false,
proxy:{
type:'localstorage',
id:'idForLocalStorage',
reader: {
type: 'json',
rootProperty: 'stuffArray'
}
}
}
});
假设您已使用以下内容填充商店:
{'stuffArray':[
{'stuffId':'130', 'stuffName':'floob', 'stuffArray':[
'first',
'second',
'tird' //here be a typo (on purpose)
]
},
{'stuffId':'131', 'stuffName':'sateo', 'stuffArray':[
'primero',
'segundo',
'tercero'
]
},
{'stuffId':'133', 'stuffName':'tolus', 'stuffArray':[
'prima',
'secunda',
'tertia'
]
}
]
}
要修复第一个记录拼写错误,您可能会尝试执行以下操作:
{//in a given controller or view
someEventHandler:function(){
var stor = Ext.getStore('LocalStuffId');
var firstRecord = stor.getAt(0);//which will get you a record in the form of a Model
firstRecord.get('stuffArray')[2]='third';//that will fix it
//now we just sync() to make the change persist when we close the app
stor.sync();
}
}
如果你试过这个,控制台上就没有错误,所以一切都好。正确?
错误!重新启动时更改将不会持续。为什么?
因为记录是“干净的”。
我们如何“弄脏”它们?
我找到的唯一方法(我确定还有更多)是通过使用模型中的 .set()方法更新记录,这将告诉商店它是脏的
对于我未经训练的MVC来说,这听起来很奇怪,更好地修复上面的例子。
{//in a given controller or view
someEventHandler:function(){
var stor = Ext.getStore('LocalStuffId');
var firstRecord = stor.getAt(0);//which will get you a record in the form of a Model
//you might go around the following 2 lines in many ways, the important part is .set() after that
var theArrayToFix = firstRecord.get('stuffArray');
theArrayToFix[2]='third';
firstRecord.set('stuffArray',theArrayToFix);//set() dirties the record
//NOW we sync() to make the change persist when we close the app
stor.sync();
}
}
所有这些对于来自sencha touch 1的人来说可能是显而易见的,但对于像我这样的新手来说,接近一天的工作就可以搞清楚了。
希望这对某人有所帮助,它将来会对我有所帮助。
答案 2 :(得分:1)
这可能是另一回事。
您在模型字段中使用“ id ”作为键名,将其更改为“ inventory_id ”之类的其他内容,然后重试。
我认为 id 由localstorage API在内部使用,因此保留。
答案 3 :(得分:1)
我知道这很古老,但也许它会对某人有所帮助。
我遇到了同样的问题,并尝试重置我的本地存储空间window.localStorage.clear();
,但它确实有效。
答案 4 :(得分:0)
似乎所有看起来都不错 - store.add()
方法与store.sync()
一起使用。检查如何将数据加载到列表中的方式,可能是刚刚未加载的数据。至于我,商店的autoload
属性总是不起作用(可能有一些原因,我不否定),而我只是使用store.load()
。此外,您可以直接检查localStorage
以确定这一点(即代理ID项localStorage.getItem('inventory-app-store')
应该为您提供类似"1,2,3"
的内容 - 成功保留记录的ID。
以下是工作示例,以防万一。
new Ext.Application({
name: 'MyApp',
launch: function() {
this.viewport = new Ext.Panel({
fullscreen: true,
id : 'mainPanel',
layout: 'card',
dockedItems: [{
xtype: 'toolbar',
dock : 'top',
items: [{
xtype: 'textfield',
flex: 1
}, {
text: 'Add',
listeners: {
tap: function () {
var view = this.viewport,
list = view.items.first(),
store = list.store,
fld = view.dockedItems.first().items.first(),
val = fld.getValue();
store.add({item: val});
store.sync();
fld.reset();
},
scope: this
}
}]
}],
items : [{
xtype: 'list',
itemTpl : '{item}',
store: new Ext.data.Store({
fields: ['item'],
proxy: {
id: 'items',
type: 'localstorage',
}
}).load()
}]
});
}
});
答案 5 :(得分:0)
在if-condition之前调用sync()方法怎么样?它对我有用。
var inventoryStore = CostsApp.views.inventoryList.getStore();
inventoryStore.load();
inventoryStore.sync();