15

我在使用 Sencha Touch 数据存储和本地代理时遇到了一些问题。基本上,当一条记录从 store 中移除时,使用 store.remove(record) 方法,记录本身会从内存中移除,但是 store 中对它的 Id 引用并没有移除,所以当页面刷新时,我收到一个可爱的“未捕获的类型错误:无法读取未定义的属性‘isModel’”

这是商店的代码:

Ext.define("App.store.Data", {
    extend: "Ext.data.Store",
    requires: "Ext.data.proxy.LocalStorage",
    config: {
        model: "App.model.Data",
        autoSync: true,
        proxy: {
            type: 'localstorage',
            id: 'app-store'
        }
    }
});

这是数据编辑器页面上删除按钮的代码

onDeleteHomeworkCommand: function () {

    var dataEditor = this.getDataEditor();
    var currentData = dataEditor.getRecord();
    var dataStore = Ext.getStore("Data");

    dataStore.remove(currentData);
    dataStore.sync();

    this.activateDataList();
},

编辑:

这是调用 remove 方法之前数据存储的屏幕截图: 在此处输入图像描述

这是之后的一个: 在此处输入图像描述

请注意,ID 仍然保留在商店的列表中,这在刷新页面时给了我未定义的错误。

4

2 回答 2

5

问题在于,当您删除记录时,本地存储代理不会从其内部 ID 列表中删除该 ID。如果您使用 destroy() 显式销毁代理中的记录,则可以解决此问题。

于 2012-09-10T12:44:51.403 回答
1

这是localstorage代理和storessencha touch 的一个已知问题,因为默认 sencha 将id 设为 int,因此当它们不是时就会出现问题。我在其中一个 sencha 论坛中找到了解决此问题的方法,它对我有用,
这是该线程的链接http://www.sencha.com/forum/showthread.php?151741-remove-record-from- localstorage
和解决方案是在 sencha touch 的源代码中编辑一行代码,就这样

现在我解决了 ID 未被清理的问题。

有一个 getID 的使用,它返回一个 Int 但 ids 列表是一个字符串数组

//This line doesn't work circa 32196
Ext.Array.remove(newIds, records[i].getId());

//Replace it with this one works fine.
Ext.Array.remove(ids, records[i].getId().toString());

这可能是因为我的模型使用了“int”类型的“id”,因为这是我认为文档建议的,但我可能是错的..看看

于 2012-09-03T13:19:24.680 回答