Sencha Touch(1.1) - 模型在“成功”保存后未在localstorage中更新

时间:2012-01-15 06:12:09

标签: model proxy save sencha-touch local-storage

我的设置

  • Safari 5.1.2(Macintosh)
  • Sencha Touch 1.1

问题

过程

我有一个模特和一个商店。我使用此处记录的set(field,value)方法更新记录:API - Set。更新字段后,我使用此处记录的save()方法:API - Save

结果

绑定到商店且的任何列表中的记录更新似乎已保存,但是当我重新加载网页旧值显示。因此记录被更新,商店看到新数据,绑定到商店的列表刷新它们的显示,但是localstorage中数据的实际表示永远不会更新。如果您使用浏览器控制台查找和检查var record = summaryStore.getAt(4)之类的项目,即使尚未进行dirty调用,您也会发现save()属性为false。此外,无论summaryStore.getUpdatedRecords()方法是否已被调用,save()都会返回一个空集。

进一步的文件

API - Models

API - Stores

API - Proxies

代码

存储

var summaryStore = new Ext.data.Store({
model: 'EventSummary',
storeId: 'summaryStore',
sortOnLoad: true,
sorters: [
    {
        property: 'date',
        direction: 'DESC'
    }
],
proxy: {
    type: 'localstorage',
    id  : 'summary-cache'
}
})

模型

Ext.regModel('EventSummary', {
fields: [
    {name: 'child', type: 'string'},
    {name: 'date', type: 'date'},
    {name: 'description', type: 'string'},
    {name: 'event_id', type: 'int'}
],
proxy: summaryStore.proxy
})

实施例

var record = summaryStore.findExact('event_id', 90)
record.date = new Date();
record.description = 'Vitamin K Shot`
record.save()

之前的 record.save()之后的dirty标志为false。 summaryStore.getUpdatedRecords()之前返回,在之后返回空集。无论记录是否已保存,所有汇总商店列表都会反映所做的更改。

附加说明

使用此调用填充商店,该调用遵循商店和模型的声明。 summaryStore.load()

3 个答案:

答案 0 :(得分:1)

上面提到的setDirty变通方法对我不起作用,但我找到了另一种将记录保存到WebLocalStorage代理的解决方法:

record.set('field1', 'abc');
store.proxy.setRecord(record);

我正在使用1.1.1。 (顺便说一下,由于某种原因,我不能调用save();例外情况说我需要一个url,这不适用于weblocalstorage。)

答案 1 :(得分:0)

使用商店中的sync()方法将数据持久保存到localstorage。

尝试使用此代码而不是上面的示例:

var record = summaryStore.findExact('event_id', 90)
record.set('date', new Date());
record.set('description', 'Vitamin K Shot`);
record.save();

summaryStore.sync();

答案 2 :(得分:0)

<强>更新

通过在将模型实例传递给商店的add方法之前正确实例化,可以完全避免该问题。我只是传递JSON,商店接受了,但显然是造成问题。

结束更新

可以通过在 WebStorageProxy.js

中进行更改来解决此问题

请注意,更改此文件不会修改sencha-touch.js文件。您必须重建它或直接修改它

此代码无效

setRecord: function(record, id) {
    if (id) {
        record.setId(id);
    } else {
        id = record.getId();
    }

由于某种原因,这一行特别是id = record.getId();在已经添加到商店的对象上未定义。解决方案是添加

if (id === undefined) {
    id = record.internalId;
}

最终代码看起来像

setRecord: function(record, id) {
    if (id) {
        record.setId(id);
    } else {
        id = record.getId();
        if (id === undefined) {
            id = record.internalId;
        }
    }