Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ExtJs-无法将存储保存到localStorage_Extjs_Proxy_Local Storage_Extjs4.2_Extjs Stores - Fatal编程技术网

ExtJs-无法将存储保存到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()

我有一个带有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')}})
},
正如第一个
控制台.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属性在内部使用。查看模型文档。