ExtJs-无法将存储保存到localStorage
我有一个带有localstorage代理的存储,但我无法保存数据。 代码非常简单:ExtJs-无法将存储保存到localStorage,extjs,proxy,local-storage,extjs4.2,extjs-stores,Extjs,Proxy,Local Storage,Extjs4.2,Extjs Stores,我有一个带有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()
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')}})
},
正如第一个控制台.log
所证明的那样,票据被添加到存储中,但是sync()
命令不起作用。localStorage inspector仅显示一个空条目Tickets:“
”,并且回调函数也不会被调用
我错过了什么?本地存储代理需要什么才能工作?
注意:问题不在于浏览器:我使用的是最新的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'}
]
});
这个问题的演示是。这花了我很多时间才找到。这个问题是由于Extjs确定记录何时需要同步的方式造成的:phantom
属性
要将新记录添加到存储,您不能提供id
。这将不起作用(由于设置了id,记录将不会被标记为幻影
,并且不会同步):
这将有助于:
store.add({name: 'new'})
store.sync()
还有一种可能的解决方法,即在添加记录后设置phantom
属性。当id
具有某种意义并且不仅仅是一个自动递增的值时,这是必要的:
Ext.Array.each(store.add({id: 1, name: 'new'}), function(record){
record.phantom = true
});
store.sync()
关于这个问题的一个暗指是:任何将真实数据库pk设置为其id属性的记录都不是幻影——它是真实的。
很明显,这条语句不一定是真的,就像上面的第一个代码片段一样,但是由于extjs4.2假设它总是真的,所以出现了错误
我希望这个解释能节省一些人的工作时间。这本可以节省我一天的时间。这花了我很多时间才找到。这个问题是由于Extjs确定记录何时需要同步的方式造成的:phantom
属性
要将新记录添加到存储,您不能提供id
。这将不起作用(由于设置了id,记录将不会被标记为幻影
,并且不会同步):
这将有助于:
store.add({name: 'new'})
store.sync()
还有一种可能的解决方法,即在添加记录后设置phantom
属性。当id
具有某种意义并且不仅仅是一个自动递增的值时,这是必要的:
Ext.Array.each(store.add({id: 1, name: 'new'}), function(record){
record.phantom = true
});
store.sync()
关于这个问题的一个暗指是:任何将真实数据库pk设置为其id属性的记录都不是幻影——它是真实的。
很明显,这条语句不一定是真的,就像上面的第一个代码片段一样,但是由于extjs4.2假设它总是真的,所以出现了错误
我希望这个解释能节省一些人的工作时间。这会节省我一天的时间。如果您想将id保留为您自己的字段名专用,则手动将模型上的idProperty
设置为其他似乎可以解决问题-请参见此。但是请注意,如果需要,您必须在属性上强制您自己的唯一性
Ext.define('MyModel'{
扩展:“Ext.data.Model”,
idProperty:“_id”,//如果您想将id
仅保留为您自己的字段名,那么手动将模型上的idProperty
设置为其他似乎可以解决问题-请参见此。但请注意,如果需要,您必须在属性上强制执行您自己的唯一性
Ext.define('MyModel'{
扩展:“Ext.data.Model”,
idProperty:“\u id”,//你的演示链接好像坏了,你能提供一把小提琴吗?行为似乎很奇怪,因为它太基本了,没有坏,只是加载需要很多时间。我找到了解决方案……你的演示链接好像坏了,你能提供一把小提琴吗?行为似乎很奇怪,因为它太基本了,没有坏没有损坏,只是加载需要很多时间。我找到了解决方案…你是对的@Lorenz,问题是id属性。但是你的解决方法不好,phantom是一个内部字段,你永远不应该修改。如果id属性很重要,那么模型应该定义一个不同的id属性在内部使用。请查看模型文档。您是对的@Lorenz,问题在于id属性。但是您的解决方法不可行,phantom是一个内部字段,您永远不应该修改它。如果id属性很重要,那么模型应该定义一个不同的id属性在内部使用。查看模型文档。