Использование data() в D3 принудительно обновляет график.

Я использую принудительную компоновку D3 и добавляю код, позволяющий пользователю выбирать отдельные узлы (здесь выбор не связан с D3 select(), но указывает на выделенное состояние узла с точки зрения пользователя). Одновременно должен быть выбран только один узел. Итак, когда пользователь нажимает на узел, который не выбран, я хочу отменить выбор любых выбранных узлов.

Я использую выбранный атрибут на узле и пытаюсь установить его, используя метод D3 data(...) или datum(...). На самом деле, я не мог заставить его работать так. То, что у меня есть сейчас, кажется немного глупым, поэтому я надеюсь, что есть более чистый способ.

function deselectAll() {
    var sc = d3.selectAll("circle")
        .filter(function(d) {return (d.selected == "y")});

    var circles = sc.data();

    sc.transition()
        .duration(50)
        .style("stroke-width", "1px")
        .style("stroke", "#3182bd");

    if(null != circles && circles.length > 0) {
        for(i=0; i<circles.length; i++) {
            circles[i].selected = "n";
        }
    }
}

Проблема в том, что добавление .data("n") в цепочку не устанавливает для "selected" значение "n". Возможно ли это сделать как часть цепочки d3?


person laloumen    schedule 23.09.2013    source источник


Ответы (1)


Многие функции выбора (или перехода) в d3 передают текущие данные из каждого узла в определенные вами функции. Вы можете изменить содержимое этого элемента данных в любое время.

Используя ваш пример, если вы хотите установить узлы, которые имеют d.selected == "y" от «y» до «n», вы можете использовать свой отфильтрованный выбор следующим образом:

sc.each(function(d) {
    d.selected = "n";
});

Эта функция будет вызываться один раз для каждого узла в выборе (каждый из которых имеет «y» для выбранного в соответствии с вашим фильтром), поэтому вы можете просто изменить значение свойства в датуме.

person Scott Cameron    schedule 23.09.2013
comment
Да, это прекрасно. Я не видел эту функцию. Спасибо! - person laloumen; 24.09.2013