更改 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: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
可能重复: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: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