可能重复: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作为根。为什么?
提前致谢
答案 0 :(得分:1)
如果我将你的代码复制到版本4.1.1的版本中,它会抛出一个Uncaught TypeError: Cannot read property 'raw' of undefined
,这是我的预期,因为在调用之后商店根本不应该包含任何记录。 load()
。
您在理解商店的作用以及代理的作用方面存在许多问题:
load
函数会告诉代理提取数据,告诉读者从中创建记录,并将其加载到商店的data
属性中,覆盖(!)您在初始化时定义的数据。autoLoad:true
将data
的内容加载到商店中 - 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