2016-02-24 4 views
1

Добрый день.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); 
     } 
    } 
    ... 
} 

, т.е. корень устанавливается невидимым, поскольку он по-прежнему пуст, и только тогда дети Рута загружены.

Вопрос: есть ли начальная ошибка дизайна в инициализации моих фильтров и как я могу ее исправить?

ответ

1

Учитывая, что проблема в том, что взгляд в 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.

+0

Бэкэнд возвращает узел, определенный по пути, содержащемуся в ** 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

+0

Спасибо, что пытались помочь. Первое, что я пробовал, но это не изменило поведения. Второй может работать, но инициализация фильтров при любом событии загрузки кажется довольно дорогостоящим исправлением, так как каждый из них вызывает фильтрацию всего дерева, и обычно имеется около 6 фильтров. – AntalOvc

+0

Добро пожаловать! Метод addFilter принимает в качестве первого параметра массив фильтров, поэтому вы можете вызвать его только один раз! –

1

Хорошо, получилось, что часть ответа была только внутри вопроса: я смог исправить эту вещь, просто перегрузив метод onNodeFilter() внутри моего магазина, так как я знаю, что хочу всегда показывать корень. Если кто-нибудь может посоветовать что-нибудь лучше - будь моим гостем, пожалуйста.

+0

Ницца, по крайней мере, вы нашли решение! знак равно –

Смежные вопросы