ExtJs - 无法将商店保存到localStorage

时间:2014-04-15 15:50:13

标签: 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(){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

2 个答案:

答案 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'}
    ]
});