Добрый день.ExtJs Последовательность загрузки дерева
Я пишу дерево управления с 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
},
});
Проблема заключается в том: мой корень явно установлен в магазине, который загружает его содержимое, потому что от расширен: true. Но тогда только эти данные отображаются в дереве без самого корня. Когда фильтрация удаляется, трет загружается ОК.
Возможная причина: от отладки Сенча кода в Ext-все-debug.js: просмотреть в InitComponent вызывается до магазина начинает загрузку данных, поэтому он добавляет фильтры перед загрузкой данных, когда корень еще пустой, а затем вызывает
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);
}
}
...
}
, т.е. корень устанавливается невидимым, поскольку он по-прежнему пуст, и только тогда дети Рута загружены.
Вопрос: есть ли начальная ошибка дизайна в инициализации моих фильтров и как я могу ее исправить?
Бэкэнд возвращает узел, определенный по пути, содержащемуся в ** full_path ** члену узла, поэтому дерево загружается динамически. Корень должен описать «верхний» узел поддерева, который я хочу загрузить, а затем я хочу изменить его извне. Мой прокси-сервер выглядит примерно так: 'proxy: {type: App.cfg.proxy, reader: {type: 'json', rootProperty: 'data.children'}, format: App.cfg.proxy.urlEnd, url: Site .cfg.url.treeRoot, noCache: false} ' – AntalOvc
Спасибо, что пытались помочь. Первое, что я пробовал, но это не изменило поведения. Второй может работать, но инициализация фильтров при любом событии загрузки кажется довольно дорогостоящим исправлением, так как каждый из них вызывает фильтрацию всего дерева, и обычно имеется около 6 фильтров. – AntalOvc
Добро пожаловать! Метод addFilter принимает в качестве первого параметра массив фильтров, поэтому вы можете вызвать его только один раз! –