Группировка позволяет разбивать дочерние узлы на группы. При этом узлы по прежнему остаются доступны в качестве линейного списка в свойстве childNodes
. Метод appendChild
не влияет на порядок узлов. Метод insertBefore
может перемещать узлы только в рамках группы, а если используется сортировка, то не влияет на порядок вовсе.
Группировкой управляет экземпляр класса basis.dom.wrapper.GroupingNode
. Это наследник AbstractNode
с возможностью иметь детей. Дочерние узлы – это группы, экземпляры класса basis.dom.wrapper.PartitionNode
, которые так же наследуется от AbstractNode
но не может иметь дочерние узлы.
При включенной группировке, каждый дочерний узел соотносится с некотором экземпляром PartitionNode
, ссылка на который хранится в свойстве groupNode
. Экземпляр PartitionNode
хранит свои члены в свойстве nodes
в правильном порядке.
Группа, в которую должен входить узел, определяется методом groupGetter
у экземпляра GroupingNode
. Но эта функция не создает групп, а возвращает некоторое значение, по которому нужно группировать дочерние узлы. Экземпляр GroupingNode
содержит карту соотвествия между значением и экземпляром PartitionNode
. Если значение новое и для него еще нет экземпляра PartitionNode
, то такой экземпляр создается. В зависимости от типа значения, немного меняется процедура создания экземпляра:
-
если значение является экземпляром
basis.data.Object
, то это значение назначается делегатом создаваемой группы; -
в ином случае, используется строковое представление значения для группировки, а само значение записывается в свойство
data
, значением ключейid
иtitle
.
Когда у группы не оказывается узлов, по умолчанию она разрушается. Это поведение управляется свойством autoDestroyIfEmpty
у группы. По умолчанию оно false
, но экземпляр GroupingNode
устанавливает его в соотвествии со значением своего свойства autoDestroyEmptyGroups
(по умолчанию true
), при неявном создании групп.
Группировка назначается присвоением значения для свойства grouping
при создании, либо методом setGrouping
. При этом задается либо экземпляр GroupingNode
, либо другое значение:
-
строка или функция преобразуются в конфиге для неявного создания экземпляра
GroupingNode
, и становятся значениемgroupGetter
; -
объект используется для неявного создания экземпляра
GroupingNode
; -
другие типы или null – отключение группировки.
Для неявного создания экземпляра GroupingNode
используется класс, который хранится в свойстве groupingClass
.
Когда группировка меняется методом setGrouping
, предыдущий экземпляр GroupingNode
разрушается. Это поведение регулируется свойством autoDestroyWithNoOwner
(по умолчанию true
). Если необходимо сохранять экземпляр, то нужно выставить это свойство в false
, либо передавать true
методу setGrouping
вторым аргументом.
Узел ссылается на экземпляр GroupingNode
свойством grouping
, а экземпляр ссылается на своего владельца свойством owner
. Экземпляр GroupingNode
может иметь лишь одного владельца.
При изменении группировки (свойства grouping
) выбрасывается groupingChanged
, которое передает обработчикам предыдущее значение группировки.
Узлы которые попадают в группу хранятся массивом в свойстве nodes
. Свойство first
указывает на первый узел в группе, а свойство last
– на последний. Узлы в свойстве nodes
хранятся ровно в том же порядке, что и в childNodes
владельца группировки.