В данной статье пойдет речь о том, как создать динамическое дерево (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