【问题标题】:Sencha Touch (1.1) - Model not updated in localstorage after "successful" saveSencha Touch (1.1) - “成功”保存后模型未在本地存储中更新
【发布时间】:2012-02-10 16:17:01
【问题描述】:

我的设置

  • Safari 5.1.2 (Macintosh)
  • 煎茶触控 1.1

问题

过程

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

结果

与商店绑定的任何列表中的记录都会更新,并且似乎已保存,但是当我重新加载网页时,旧值 > 显示。所以记录被更新,存储看到新数据,绑定到存储的列表刷新它们的显示,但本地存储中数据的实际表示永远不会更新。如果您使用浏览器控制台查找并检查带有var record = summaryStore.getAt(4) 之类的项目,您会发现dirty 属性为假,即使没有进行save() 调用。同样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标志都是假的。 summaryStore.getUpdatedRecords() 在保存之前之后返回一个空集。无论记录是否保存,汇总存储的所有列表都会反映所做的更改。

附加说明

商店由这个调用填充,它遵循商店和模型的声明。 summaryStore.load()

【问题讨论】:

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


    【解决方案1】:

    使用 store 上的 sync() 方法将数据持久化到 localstorage。

    试试这个代码而不是你上面的例子:

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

    【讨论】:

    • 不幸的是,这在这种情况下不起作用。商店实际上无法识别更改 summaryStore.getUpdatedRecords() 返回一个空集。
    • 设置好值后,试试model.setDirty()。
    • 不幸的是,这也不起作用。我最终不得不对 WebStorageProxy 对象进行源更改。
    【解决方案2】:

    更新

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

    结束更新

    可以通过在 WebStorageProxy.js

    中进行更改来解决此问题

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

    此代码无效

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

    由于某种原因,这一行尤其是 id = record.getId(); 在已添加到存储中的对象上出现 undefined。解决方法是添加

    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;
            }
        }
    

    【讨论】:

      【解决方案3】:

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

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

      我使用的是 1.1.1。 (顺便说一句,由于某种原因我不能调用 save();异常说我需要一个 url,这不适用于 weblocalstorage。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-26
        • 1970-01-01
        • 1970-01-01
        • 2011-11-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多