2016-07-26 3 views
0

У меня, вероятно, есть какой-то ущерб от повреждения мозга, потому что что-то вроде должно быть тривиально.Получите идентификатор перетаскиваемого элемента в d3.js

У меня есть куча кругов SVG, созданных вручную (через React). Затем я прикрепляю поведение d3 к всем им. Применяется поведение перетаскивания, и функция перетаскивания выполняется, но когда я перетаскиваю один из этих кругов, я не могу ответить соответствующим образом, потому что я не знаю, какой из них был перемещен. Где я могу получить идентификатор перетаскиваемого элемента?

Я проверил несколько других вопросов и нашел только какое-то безумное решение для фильтров ... это не может быть так.

Я также заглянул в docs и нашел свойство subject .. однако, что он имеет значение null, везде я пробовал.

Мой код:

componentWillUpdate() { 
    let nodes = d3.selectAll("circle"); 

    const dragFn = (d,i) => { 
     d3.event.sourceEvent.stopPropagation(); 
     this.props.onNodeDrag(I_NEED_AN_ID_HERE); 
    } 

    const dragBehavior = d3.behavior.drag(); 
    dragBehavior.on('drag', dragFn); 
    dragBehavior.on('dragstart',() => { 
     d3.event.sourceEvent.stopPropagation(); 
    }); 

    nodes.call(dragBehavior); 
    } 
+0

Пожалуйста, не редактируйте ответ в своем вопросе! См.: [* «У пользователя есть право редактировать принятый ответ на свой вопрос?» * (Http://meta.stackoverflow.com/questions/262806), [* «Лучше ответить или отредактировать свой вопрос для публикации решения? »* (http://meta.stackoverflow.com/questions/307553), [*« Редактирование ответа на самостоятельный ответ »*) (http://meta.stackoverflow.com/questions/278050) и т. д. Положите его на самостоятельный ответ, если вы считаете, что существующий ответ недостаточно конкретный. – altocumulus

+0

@altocumulus: хорошо, спасибо. – Damb

ответ

3

Я не знаю, что ваш «это» внутри функции, но в штатской JS вы можете получить любой атрибут элемента HTML с:

d3.select(this).attr("id"); //or class etc. 

или если он обернут

d3.select(this).select("circle").attr("id"); 

Вот пример: http://jsfiddle.net/a2QpA/343/

+1

Спасибо, это сделало :) Я немного изменил код, чтобы сохранить этот контекст, и использовал d3.select (this). Будет обновлен вопрос и принять этот ответ немного. – Damb