В данной статье пойдет речь о том, как создать динамическое дерево (TreeList) в ExtJS Modern. Возможно данная реализация есть в «коробке», но я ее не нашел.
Стандарный компонент treelist отлично работает, если в хранилище находится например 100 записей, но если их будет тысяча или более? У меня получилось так, что мобильный телефон стал заметно тормозить. И после долгих поисков решения в интернете, решил доработать компонент.
Первое что я сделал — это создал наследник от treelist
Ext.define('MobileService.view.routeList.items.MobileTreeList', {
    extend: 'Ext.list.Tree',
    xtype: 'mobiletreelist',
 
    privates: {
        // expand - стоит строить дочернии элементы или нет. По умолчанию null
        createItem: function (node, parent, expand) {
            var isRootItem = node.get('isRootItem'); // требуется для определения корневого элемента (те записи которые видит пользователь на первом уровне)
            if (!isRootItem && !expand)
                return null;
 
            return this.callParent(arguments);
        },
        // переопределен. Основной метод для добавления дочерних элементов
        onNodeExpand: function (node) {
            var item = this.getItem(node);
            var childNodes = node.childNodes;
            for (i = 0, len = childNodes.length; i < len; ++i) {
                child = childNodes[i];
                if (!this.itemMap[child.internalId]) {
                    var _item = item.getOwner().createItem(child, item, true);
                    if (_item) {
                        this.itemMap[child.internalId] = _item;
                        item.insertItem(_item, null);
                    }
                }
            }
            this.callParent(arguments);
        }
    }
});
Второе, создаем наследник от Ext.list.TreeItem
/*
 * для вывода дерево документов и строк я создал собственный класс для TreeItem
 */
Ext.define('MobileService.view.routeList.items.RouteListItem', {
    extend: 'Ext.list.TreeItem',
    xtype: 'routelistitem',
 
    privates: {
        updateNode: function (node) {
            if (node) {
                var me = this,
                    map = me.itemMap,
                    childNodes, owner, len, i, item, child;
                me.element.dom.setAttribute('data-recordId', node.internalId);
                if (!map) {
                    childNodes = node.childNodes;
                    owner = me.getOwner();
                    me.itemMap = map = {};
                    for (i = 0, len = childNodes.length; i < len; ++i) {
                        child = childNodes[i];
                        item = owner.createItem(child, me);
                        if (item) { // добавили проверку на возможность создания ветки
                            map[child.internalId] = item;
                            me.insertItem(item, null);
                        }
                    }
                }
                me.setExpanded(node.isExpanded());
                me.doNodeUpdate(node);
            }
        }
    }
});
Третье, создаем данные для хранилища
var root = {
    expanded: true,
    children: [
        {
            text: 'item1',
            isRootItem: true,
            children: [
                ....
            ]
        },
        {
            text: 'item1',
            isRootItem: true,
            children: [
                ....
            ]
        }
    ]
};
var store = Ext.create('Ext.data.TreeStore', {
            root: root
});
Наконец и сам компонент
                xtype: 'mobiletreelist',
                height: '100%',
                defaults: {
                    xtype: 'routelistitem'
                }
Вроде все, должно работать. Все дочернии элементы будут отрисовывать динамически
Ext JS 6.0.0.640