Функция .call() передает функцию в качестве аргумента вместо результата

Я вижу некоторое поведение в D3, которого я не ожидаю, и я не знаю, как это обойти. С этим блоком кода:

node.append("text")
    .attr("dy", ".3em")
    .style("text-anchor", "middle")
    .text(function (d) { return d.FSname; })
    .attr("radius", function (d) { return d.r;})
    .call(wrap, function(d) {return d.r;})
   //.call(wrap, 140)
;

Вот функция wrap():

function wrap(text, width) {
    //reflows text to be within a pixel width
    console.log("hit wrap(",text,width,this,")");
    text.each(function () {
        var text = d3.select(this),
            words = text.text().split(/\s+/).reverse(),
            word,
            line = [],
            lineNumber = 0,
            lineHeight = 1.0, // ems
            y = text.attr("y"),
            dy = parseFloat(text.attr("dy")),
            tspan = text.text(null).append("tspan").attr("x", 0).attr("y", y).attr("dy", dy + "em");
        while (word = words.pop()) {
            line.push(word);
            tspan.text(line.join(" "));
            if (tspan.node().getComputedTextLength() > width) {
                if (line.length > 1) line.pop();
                tspan.text(line.join(" "));
                line = [word];
                tspan = text.append("tspan").attr("x", 0).attr("y", y).attr("dy", ++lineNumber * lineHeight + dy + "em").text(word);
            }
        }
    });
}

Я хочу передать радиус круга для пузырьковой диаграммы в функцию переноса, но в аргументе width я получаю саму функцию, а не разрешенный d.r. Есть ли способ заставить эту анонимную функцию разрешить значение перед передачей ее в .call() ?


person Craig Soich    schedule 10.11.2015    source источник
comment
.call используется для изменения this функции, вы уверены, что не хотите просто вызывать?   -  person Paul S.    schedule 10.11.2015
comment
@ПолС. здесь call может быть простой функцией от объекта, а не собственной функцией call   -  person Grundy    schedule 10.11.2015
comment
wrap() — это функция переноса текста MBostock (см. редактирование выше)   -  person Craig Soich    schedule 10.11.2015
comment
какое значение для параметра text? было бы здорово, если бы вы могли предоставить образец скрипки   -  person Grundy    schedule 10.11.2015
comment
попробуйте посмотреть doc: первый аргумент - это выбор и второй аргументы, поэтому он не вызывает функцию, которую вы передаете в качестве второго аргумента.   -  person Grundy    schedule 10.11.2015
comment
К вашему сведению, исходная функция вызов : как видите, это простейшее apply внутри   -  person Grundy    schedule 10.11.2015


Ответы (2)


Вы можете использовать .each() вместо .call():

node.append("text")
  ...
  .each(function(d) { wrap(d3.select(this), d.r); });

Кроме того, вы можете изменить определение wrap(), чтобы применить функцию:

function wrap(text, widthFunc) {
  // ...
  text.each(function(d) {
    var width = widthFunc(d);
    // ...
  });
}
person Lars Kotthoff    schedule 10.11.2015
comment
Это сделало это! each() была функция для вызова. примеры, из которых я вытащил эту функцию, использовали call(), но я думаю, это было потому, что ширина была постоянной. Спасибо! - person Craig Soich; 10.11.2015
comment
Функция wrap() просто не предназначена для вызова с помощью функции. Я склоняюсь к последнему подходу; исправление функции, чтобы ее можно было вызывать так, как вы хотите. - person Lars Kotthoff; 10.11.2015

.attr("radius", function (d) { return wrap.call(this, d.r) });

Если wrap возвращает число (или строку, представляющую число, потому что d3 всегда возвращает +value), он будет работать нормально.

person Stranded Kid    schedule 10.11.2015
comment
Извините, я не был ясен. Строка .attr("radius".... работает как положено. это функция call(), которая передает функцию в параметр width вместо результирующего значения. - person Craig Soich; 10.11.2015