D3.ДС: уберите силу.перетаскивание из выделенной области


У меня есть (довольно простой) вопрос: Как "отменить вызов" силы.перетащите выделение, сделанное D3.js? Допустим, я создал набор элементов и вызвал "вызов" на нем, придав ему функцию перетаскивания-обратного вызова принудительного макета. Это выглядело так:

    d3.selectAll('rect').call(force.drag);

Теперь можно будет удалить это поведение из некоторых узлов позже. Мои подходы включали сброс различных слушателей, таких как "щелчок", "перетаскивание" и т. д. использование

    d3.select('rect#no-drag').on('click', null);
Ни один из них не сработал. Кто-нибудь знает, как это делается? убрать обратный вызов?
3 10

3 ответа:

Вы близки. Событие перетаскивания инициируется событием mousedown с пространством имен drag. Смотрите: https://github.com/mbostock/d3/blob/master/src/behavior/drag.js#L5

Итак, чтобы удалить это, вы можете сделать:

d3.select('rect#no-drag').on('mousedown.drag', null);

Этот вопрос не спрашивает, Как получить мелкозернистый контроль над элементом перетаскивания, но я пришел сюда, чтобы узнать, как включить/выключить перетаскивание в зависимости от условий, и asker также спросил, Как вернуть перетаскивание после удаления его в комментариях.

Таким образом, для тех, кто ищет, как условно разрешить событие перетаскивания, используйте перетаскивание.фильтр .

drag.filter принимает обратный вызов, который должен возвращать логическое значение. Если обратного вызова возвращает true, перетаскивание происходит, иначе тащить не срабатывает.

Это намного чище, чем удаление перетаскивания из выделения и последующая попытка его повторного применения.

Эта строка как-то не совместима с мобильными устройствами (chrome / android)

d3.select('rect#no-drag').on('mousedown.drag', null);