更改 MemoryStore 的根目录不起作用

Change Root of MemoryStore not working

可能重复:How to set url and root dynamically in extjs

你好,我有一个简单的 memoryStore。如果我在 Ext.Define 期间尝试不声明它的代理,我以后将无法检索到正确的数据根,即使我确实设置了代理。难道我做错了什么?

这是一个测试用例:

var store = Ext.create('Ext.data.Store', {
    storeId: 'JailNames',
    autoLoad: true,
    fields: [
        {
            name: 'name',
            type: 'string'
        },
    ],
    data: {
        data_regionI: [
                    {name: "Jail 1"},
                    {name: "Jail 2"},
                    {name: "Jail 3"},
        ],
        data_regionII: [
                    {name: "Jail 4"},
                    {name: "Jail 5"},
                    {name: "Jail 6"},
        ],
    },
    proxy: {
        type: 'memory',
        reader: {
            type: 'json',
            root: 'data_regionI'
        }
    }
})



  store.setProxy({
          type: 'memory',
          reader: {
              type: 'json',
              root: 'data_regionII'
          }
      } )

store.load();
store.getAt(0).raw //still returns Jail 1

查看 store.getProxy().reader.root 我得到 data_regionII 作为根。为什么? 提前致谢

如果我将您的代码复制到版本 4.1.1 的煎茶 fiddle 中,它会抛出一个 Uncaught TypeError: Cannot read property 'raw' of undefined,这是我所期望的,因为商店根本不应该包含任何记录在调用 load().

之后

你对商店做什么和代理做什么的理解有很多问题:

  • 普通存储的 load 函数将告诉代理获取数据,告诉 reader 从中创建记录,并将其加载到 data 属性 你的商店,覆盖(!)你在初始化时定义的数据。
  • 但是内存存储的加载函数根本不打算做任何事情,也根本不打算使用。
  • 内存存储不能同时保存多个存储内容。 (但是,您可以将未使用的内容存储在商店的 JavaScript 对象的 unused(!) 属性 中。
  • 商店,无论是哪个代理,都不需要autoLoad:truedata的内容加载到商店中——data的内容自动用作默认数据初始化后的商店。

也就是说,仍然可以通过几行代码实现您想要的效果。您甚至不必创建我为提高可读性而创建的所有函数:

var store = Ext.create('Ext.data.Store', {
    storeId: 'JailNames',
    fields: [
        {
            name: 'name',
            type: 'string'
        },
    ],
    myData: { // custom property!
        data_regionI: [
                    {name: "Jail 1"},
                    {name: "Jail 2"},
                    {name: "Jail 3"},
        ],
        data_regionII: [
                    {name: "Jail 4"},
                    {name: "Jail 5"},
                    {name: "Jail 6"},
        ],
    },
    loadRegion1:function() {
        this.loadRegion("data_regionI");
    },
    loadRegion2:function() {
        this.loadRegion("data_regionII");
    },
    loadRegion:function(rootProperty) { // custom function for better readability
        this.loadRawData(this.myData[rootProperty]); // load data without proxy, but with reader!
    },
    proxy: {
        type: 'memory',
        reader: {
            type: 'json'
        }
    }
});
store.loadRegion1();
console.log(store.getAt(0).get("name")); //returns Jail 1
store.loadRegion2();
console.log(store.getAt(0).get("name")); //returns Jail 4