1

我有一个带有本地存储代理的商店,但我无法保存数据。代码很简单:

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函数也不会被调用。

我错过了什么?本地存储代理需要什么才能工作?

注意:问题不在于浏览器:我使用的是最新的 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'}
    ]
});

问题的演示在这里

4

2 回答 2

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 假定它始终是真的,所以出现了错误。

我希望这个解释可以节省一些人的工作时间。它会为我节省一天的时间。

于 2014-04-18T16:01:49.580 回答
2

如果您想id专门为您自己的字段名称保留,然后手动将idProperty模型上的设置为其他名称似乎可以解决问题 - 请参阅此工作演示。但请注意,如果需要,您必须在属性上强制执行您自己的唯一性。

Ext.define('MyModel', {
    extend: 'Ext.data.Model',
    idProperty: '_id',  // <-- here 
    fields: [
        {name: 'id', type: 'int'},
        {name: 'name', type: 'string'}
    ]
});
于 2014-04-24T13:16:32.460 回答