Поле clear в механизме выделений Vega-Lite определяет
событие, при котором текущее выделение сбрасывается. После срабатывания
очистки состояние selection возвращается к исходному виду: выбранные
элементы снимаются, фильтры перестают действовать, условные стили
возвращаются к начальному состоянию.
clear используется внутри описания
selection-параметра:
params: [
{
name: "brush",
select: {
type: "interval",
clear: "dblclick"
}
}
]
В этом примере двойной клик удаляет текущее выделение.
clear
играет важную рольБез механизма очистки интерактивная визуализация быстро становится неудобной:
Поле clear решает эту проблему, предоставляя
контролируемый способ сброса selection.
Каждое selection-состояние хранится внутри внутреннего хранилища Vega-Lite. Пока выделение активно:
Когда событие clear срабатывает:
По умолчанию Vega-Lite автоматически использует:
clear: "dblclick"
Это означает:
Пример:
{
params: [
{
name: "point_select",
select: "point"
}
]
}
Даже без явного указания clear, двойной клик будет
работать.
clear{
params: [
{
name: "brush",
select: {
type: "interval",
clear: "dblclick"
}
}
]
}
Наиболее распространённый вариант.
Подходит для:
clear: falseИногда требуется запретить автоматический сброс.
{
params: [
{
name: "selected",
select: {
type: "point",
clear: false
}
}
]
}
Теперь:
transform: [
{
filter: {
param: "selected"
}
}
]
Если selection управляет критически важной фильтрацией, случайный сброс может нарушить интерфейс.
Например:
В таком случае очисткой управляет уже не Vega-Lite, а приложение.
clear принимает не только dblclick, но и
любые Vega event streams.
clear: "click"
Пример:
{
params: [
{
name: "brush",
select: {
type: "interval",
clear: "click"
}
}
]
}
Теперь любой клик удаляет selection.
Поведение становится более агрессивным:
Но есть и минусы:
Vega event system поддерживает keyboard events.
clear: "keydown[event.key === 'Escape']"
Пример:
{
params: [
{
name: "selectData",
select: {
type: "point",
clear: "keydown[event.key === 'Escape']"
}
}
]
}
Теперь:
Особенно полезно в сложных аналитических интерфейсах:
Система событий Vega позволяет комбинировать несколько условий.
clear: "dblclick, keydown[event.key === 'Escape']"
Теперь selection очищается:
Такой подход улучшает usability:
| Событие | Назначение |
|---|---|
dblclick |
мышь |
Escape |
клавиатура |
touchend |
mobile |
contextmenu |
альтернативный UX |
clear с
point selection{
data: {
values: [
{x: 10, y: 20},
{x: 30, y: 40},
{x: 50, y: 60}
]
},
params: [
{
name: "pts",
select: {
type: "point",
clear: "dblclick"
}
}
],
mark: "point",
encoding: {
x: {field: "x", type: "quantitative"},
y: {field: "y", type: "quantitative"},
color: {
condition: {
param: "pts",
value: "red"
},
value: "gray"
}
}
}
clear с
interval selection{
params: [
{
name: "brush",
select: {
type: "interval",
clear: "dblclick"
}
}
]
}
После drag-выделения:
После double click:
clear
и emptyПоле empty определяет, как трактуется отсутствие
selection.
{
condition: {
param: "brush",
empty: false,
value: "red"
},
value: "gray"
}
После clear selection становится пустым.
Далее вступает в работу empty.
empty: trueПоведение:
empty: falseПоведение:
transform: [
{
filter: {
param: "brush"
}
}
]
Если selection очищается:
clear: "dblclick"
то filter перестаёт ограничивать данные.
Результат:
select: {
type: "point",
toggle: true,
clear: "dblclick"
}
Пользователь может:
Но clear очищает всё selection полностью.
Иногда требуется управлять сбросом извне.
Внутри Vega runtime selection хранится как signal.
Пример:
view.signal("brush", null).run();
button.oncl ick = () => {
view.signal("brush", null).run();
};
Например:
clear в layered chartslayer: [
{
mark: "point"
},
{
mark: "text"
}
]
Selection может использоваться всеми слоями одновременно.
После clear:
Один selection может управлять несколькими представлениями.
hconcat: [
chart1,
chart2
]
Левый график:
params: [
{
name: "brush",
select: {
type: "interval",
clear: "dblclick"
}
}
]
Правый график:
transform: [
{
filter: {
param: "brush"
}
}
]
После двойного клика:
clear от
toggleПоля часто путают.
toggleУправляет:
clearУправляет:
| Поле | Назначение |
|---|---|
toggle |
изменение отдельных элементов |
clear |
очистка всего состояния |
empty |
поведение пустого selection |
После компиляции Vega-Lite создаёт event stream.
Примерно так:
{
clear: {
events: "dblclick"
}
}
При наступлении события runtime:
Проблемный пример:
select: {
type: "point",
on: "click",
clear: "click"
}
Одно и то же событие:
В результате выделение визуально «не работает».
dblclick не всегда удобен на mobile.
clear: "touchend"
или:
clear: "pointerup"
Слишком агрессивные события делают интерфейс неудобным.
Плохой пример:
clear: "mousemove"
Selection будет исчезать практически мгновенно.
Оптимально:
clear: "dblclick"
Лучше:
clear: "touchend"
или:
clear: "pointerup"
Хорошая практика:
clear: "dblclick, keydown[event.key === 'Escape']"
Подходит:
clear: false
с внешним reset-механизмом.
const spec = {
data: {
values: [
{x: 10, y: 20, cat: "A"},
{x: 15, y: 35, cat: "B"},
{x: 25, y: 10, cat: "A"},
{x: 40, y: 50, cat: "C"}
]
},
params: [
{
name: "brush",
select: {
type: "interval",
clear: "dblclick"
}
}
],
mark: "point",
encoding: {
x: {
field: "x",
type: "quantitative"
},
y: {
field: "y",
type: "quantitative"
},
color: {
condition: {
param: "brush",
field: "cat",
type: "nominal"
},
value: "lightgray"
},
size: {
condition: {
param: "brush",
value: 200
},
value: 80
}
}
};
const spec = {
data: {
values: [
{cat: "A", value: 10},
{cat: "B", value: 20},
{cat: "C", value: 30},
{cat: "D", value: 40}
]
},
hconcat: [
{
params: [
{
name: "sel",
select: {
type: "point",
clear: "dblclick"
}
}
],
mark: "bar",
encoding: {
x: {
field: "cat",
type: "nominal"
},
y: {
field: "value",
type: "quantitative"
},
color: {
condition: {
param: "sel",
value: "orange"
},
value: "steelblue"
}
}
},
{
transform: [
{
filter: {
param: "sel"
}
}
],
mark: "text",
encoding: {
text: {
field: "cat"
}
}
}
]
};