Как использовать класс d3 для определения имени как функции

Я использую класс d3 classed selection, а в первом параметре вместо String я хочу использовать функцию, которая вернет имя класса.

selection.classed(name[, value])

Я понимаю, что могу сделать то же самое с использованием attr, как упоминалось здесь, но я хочу иметь возможность делать то же самое с помощью classed. Как я могу это сделать?

Ответ 1

Имя класса, которое вы там указываете, должно быть исправлено, т.е. вы не можете иметь что-то вроде function(d) { return d; }. Если вам нужно имя класса, которое будет определено данными, вам нужно использовать .attr("class", ...).

Если вы беспокоитесь о перезаписи существующих имен классов, обратите внимание, что вы можете получить и добавить их следующим образом.

.attr("class", function(d) { return d3.select(this).attr("class") + " " + d; })

Ответ 2

Я столкнулся с аналогичной проблемой, в которой я хотел добавить один класс, если свойство в моей базе данных было истинным и другим классом, если свойство было ложным:

selection.classed('class-one', function(d) { return d.property; })
    .classed('class-two', function(d) { return d.property; });

Если у вас есть небольшое количество классов для добавления, то что-то вроде этого, возможно, стоит рассмотреть.

Ответ 3

Ответ на Lars велик, но если вы начинаете без класса в атрибуте, он добавит класс 'null' к элементу, так как нулевой атрибут будет привязан к строке. Естественный следующий шаг от его:

.attr("class", function(d) {
      var existing = d3.select(this).attr("class") 
      if (existing == null){
        return d.column.class
      }else{
        return existing + " " + d.column.class
      }
})

Это может быть сделано в однострочный с тернарным оператором, если вы хотите, чтобы он был более кратким

Ответ 4

Как и в предлагаемом ответе, но я нашел

selection.each(function(d) { d3.select(this).classed(d.class, true)

также работает.