Содержание

Группировка

Группировка позволяет разбивать дочерние узлы на группы. При этом узлы по прежнему остаются доступны в качестве линейного списка в свойстве 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, которое передает обработчикам предыдущее значение группировки.

GroupingNode

PartitionNode

Узлы которые попадают в группу хранятся массивом в свойстве nodes. Свойство first указывает на первый узел в группе, а свойство last – на последний. Узлы в свойстве nodes хранятся ровно в том же порядке, что и в childNodes владельца группировки.