ExtJs Tree加载顺序
ExtJs Tree loading sequence
美好的一天。
我正在用 Ext.tree.Panel 编写一个树形控件,它从外部 .json 文件加载其配置,同时将数据加载为 .json 来自服务器。
所以,我有这样的观点:
Ext.define('App.tree.TreeView', {
extend: 'Ext.tree.Panel',
...
initFilters: function(cfg) {
/*several this.store.addFilter() based on cfg*/
},
initComponent: function () {
var me = this;
me.cfg = getSomeCfgFromSomewhere();
me.initFilters(me.cfg);
}
});
店铺:
Ext.define('Site.widgets.tree.TreeStore', {
extend: 'Ext.data.TreeStore',
...
proxy: {
type: App.cfg.proxy,
reader: { type: 'json', rootProperty: 'data.children' },
format: App.cfg.proxy.urlEnd,
url: App.cfg.treeRoot,
noCache: false
}
lazyFill: true,
rootVisible: true,
root: {
full_path: '/', /*set as idProperty in model*/
'display-name': 'root',
expanded: true
},
});
问题是:我的根在商店中明确设置,因为 expanded: true 加载了它的内容。但是只有这些内容显示在树中,没有根本身。去掉过滤后,tre加载成功。
可能的原因:ext-all-debug.js中Sencha代码的调试:视图的initComponent在store开始加载数据之前被调用,因此它添加了过滤器在加载数据之前,当根仍然为空时,然后调用
onNodeFilter: function(root, childNodes) {
var me = this,
data = me.getData(),
toAdd = [];
if (me.getRootVisible()) {
if (childNodes.length) {
toAdd.push(root);
} else {
root.set('visible', false, me._silentOptions);
}
}
...
}
,即根设置为不可见,因为它仍然是空的,然后才加载根的子项。
问题是:我的过滤器初始化是否存在初始设计错误,我该如何解决?
考虑到问题是视图的 initComponent 在商店开始加载数据之前被调用,我会尝试:
在商店加载事件中调用 initFilters,如下所示:
Ext.define('Site.widgets.tree.TreeStore', {
extend: 'Ext.data.TreeStore',
...
proxy: {
type: App.cfg.proxy,
reader: { type: 'json', rootProperty: 'data.children' },
format: App.cfg.proxy.urlEnd,
url: App.cfg.treeRoot,
noCache: false
}
lazyFill: true,
rootVisible: true,
root: {
full_path: '/', /*set as idProperty in model*/
'display-name': 'root',
expanded: true
},
listeners : {
load : function() {
//Call initFilters.
//initFilters should call addFilter just once,
//with array of filters as first parameter,
//to avoid filtering the hole tree more than once!
}
}
});
这种方法有问题,因为你必须处理 initFilters cfg 参数范围。
好的,原来部分答案就在问题中:我可以通过简单地在我的商店中重载 onNodeFilter()
方法来解决这个问题,因为我知道我想始终显示根。如果有人能提出更好的建议 - 请做我的客人。
美好的一天。
我正在用 Ext.tree.Panel 编写一个树形控件,它从外部 .json 文件加载其配置,同时将数据加载为 .json 来自服务器。
所以,我有这样的观点:
Ext.define('App.tree.TreeView', {
extend: 'Ext.tree.Panel',
...
initFilters: function(cfg) {
/*several this.store.addFilter() based on cfg*/
},
initComponent: function () {
var me = this;
me.cfg = getSomeCfgFromSomewhere();
me.initFilters(me.cfg);
}
});
店铺:
Ext.define('Site.widgets.tree.TreeStore', {
extend: 'Ext.data.TreeStore',
...
proxy: {
type: App.cfg.proxy,
reader: { type: 'json', rootProperty: 'data.children' },
format: App.cfg.proxy.urlEnd,
url: App.cfg.treeRoot,
noCache: false
}
lazyFill: true,
rootVisible: true,
root: {
full_path: '/', /*set as idProperty in model*/
'display-name': 'root',
expanded: true
},
});
问题是:我的根在商店中明确设置,因为 expanded: true 加载了它的内容。但是只有这些内容显示在树中,没有根本身。去掉过滤后,tre加载成功。
可能的原因:ext-all-debug.js中Sencha代码的调试:视图的initComponent在store开始加载数据之前被调用,因此它添加了过滤器在加载数据之前,当根仍然为空时,然后调用
onNodeFilter: function(root, childNodes) {
var me = this,
data = me.getData(),
toAdd = [];
if (me.getRootVisible()) {
if (childNodes.length) {
toAdd.push(root);
} else {
root.set('visible', false, me._silentOptions);
}
}
...
}
,即根设置为不可见,因为它仍然是空的,然后才加载根的子项。
问题是:我的过滤器初始化是否存在初始设计错误,我该如何解决?
考虑到问题是视图的 initComponent 在商店开始加载数据之前被调用,我会尝试:
在商店加载事件中调用 initFilters,如下所示:
Ext.define('Site.widgets.tree.TreeStore', {
extend: 'Ext.data.TreeStore',
...
proxy: {
type: App.cfg.proxy,
reader: { type: 'json', rootProperty: 'data.children' },
format: App.cfg.proxy.urlEnd,
url: App.cfg.treeRoot,
noCache: false
}
lazyFill: true,
rootVisible: true,
root: {
full_path: '/', /*set as idProperty in model*/
'display-name': 'root',
expanded: true
},
listeners : {
load : function() {
//Call initFilters.
//initFilters should call addFilter just once,
//with array of filters as first parameter,
//to avoid filtering the hole tree more than once!
}
}
});
这种方法有问题,因为你必须处理 initFilters cfg 参数范围。
好的,原来部分答案就在问题中:我可以通过简单地在我的商店中重载 onNodeFilter()
方法来解决这个问题,因为我知道我想始终显示根。如果有人能提出更好的建议 - 请做我的客人。