我有一个带有localstorage代理的商店,但我无法保存数据。 代码非常简单:
onToolbarTicketsadd: function(me){
var tickets = this.getStore('Tickets');
tickets.add({id: 1, name: 'new'})
console.log(tickets.getById(1), tickets.count())
tickets.sync({callback: function(){console.log('synched')}})
},
当第一个console.log
证明时,票证会添加到商店,但sync()
命令不起作用。 localStorage检查器仅显示空条目Tickets: ''
,并且callback
函数也不会被调用。
我错过了什么? localstorage代理需要什么才能工作?
注意:问题不在于浏览器:我使用的是最新的Chrome和Firefox。
以下是商店和模型的代码:
Ext.define('App.store.Tickets', {
extend: 'Ext.data.Store',
model: 'App.model.Ticket',
proxy: {
type: 'localstorage',
id: 'Tickets'
}
});
Ext.define('App.model.Ticket', {
extend: 'Ext.data.Model',
fields: [
{name: 'id', type: 'int'},
{name: 'name', type: 'string'}
]
});
问题的演示是here。
答案 0 :(得分:3)
这花了我很多时间才找到。问题是由于Extjs确定何时需要同步记录的方式:phantom
属性。
要向商店添加新记录,您不得提供id
。这不起作用(因为设置了id,记录不会被标记为phantom
,并且它不会被同步):
store.add({id: 1, name: 'new'})
store.sync()
这将有效:
store.add({name: 'new'})
store.sync()
通过在添加记录后设置phantom
属性,还有一种可能的解决方法。当id
具有某些含义并且不仅仅是自动增量值时,这可能是必要的:
Ext.Array.each(store.add({id: 1, name: 'new'}), function(record){
record.phantom = true
});
store.sync()
问题的解决方法是Extjs.data.Model.phantom
:任何将真实数据库pk设置为其id属性的记录都不是幻像 - 它是真实的。
很明显,这个陈述不一定是真的,就像上面的第一个代码片段一样,但是因为Extjs 4.2总是认为它是真的,所以会出现bug。
我希望这个解释可以节省一些人的工作时间。这本来可以让我节省一天。
答案 1 :(得分:2)
如果您想将id
专门用于自己的字段名称,那么手动将模型上的idProperty
设置为其他内容似乎可以解决问题 - 请参阅此working demo。但请注意,如果需要,您必须在属性上强制执行自己的唯一性。
Ext.define('MyModel', {
extend: 'Ext.data.Model',
idProperty: '_id', // <-- here
fields: [
{name: 'id', type: 'int'},
{name: 'name', type: 'string'}
]
});