更改MemoryStore的根目录不起作用

时间:2016-07-04 07:56:12

标签: extjs extjs4.1

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

您好,我有一个简单的记忆存储。如果我在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作为根。为什么? 提前致谢

1 个答案:

答案 0 :(得分:1)

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

您在理解商店的作用以及代理的作用方面存在许多问题:

  • 普通商店的load函数会告诉代理提取数据,告诉读者从中创建记录,并将其加载到商店的data属性中,覆盖(!)您在初始化时定义的数据。
  • 但是记忆存储器的负载功能根本不打算做任何事情,并且根本不打算使用。
  • 内存存储不是要同时容纳多个商店内容。 (但是,您可以将未使用的内容存储在商店JavaScript对象的未使用的(!)属性中)。
  • 商店,无论是哪个代理,都不需要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