D3.js: удалить force.drag из выделения

У меня есть (довольно простой) вопрос: как "un-call" force.drag на выбор, сделанный D3.js? Скажем, я создал набор элементов и назвал "вызов" на нем, давая ему перетащить обратный вызов направленной по силе макета. Это выглядело так:

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

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

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

Ни один из них не работал. Кто-нибудь знает, как удалить обратный вызов?

Ответ 1

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

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

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

Ответ 2

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

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

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

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

Ответ 3

Эта строка как-то не мобильна (хром/андроид)

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