2

我需要从值函数中访问数据的父数组。有没有办法在不使用更高级别的变量的情况下做到这一点?

换句话说,

var data = ["a", "b", "c"],
    svg = d3.select("svg");

svg.selectAll("rect").data(data).enter().append("rect")
    .attr("x", function(d, i) {

        // how do I access `d's` parent array from here
        // without using the closure variable `data`?

    });

编辑:

我正在避免关闭,因为我的现实世界情况更复杂,并且在我的情况下创建这种类型的关闭很尴尬。

4

2 回答 2

2

有几种方法可以做到这一点(尽管我认为关闭是最简单的选择)。

一种方法是调用.data()当前选择:

var rect = svg.selectAll("rect")
    .data(data);

rect.enter().append("rect")
    .attr("x", function(d, i) {
        console.log(rect.data());
    });

在这种情况下,您需要一个要引用的变量。另一种方法是通过 运行它.call,它为您提供当前选择作为参数:

svg.selectAll("rect")
    .data(data)
  .enter().append("rect")
    .call(function(selection) {
        // get the data into your scope
        var dataArray = selection.data();
        // do more stuff with the selection
        selection
            .attr("x", function(d, i) {
                console.log(data);
            });
    });
于 2013-05-24T22:44:22.113 回答
1

You can do the same selection inside the element's attribute method and map each element in the selection to retrive the __data__ attribute:

svg.selectAll('rect')
    .data(data)
    .enter()
    .append("rect")
    .attr('x', function(d, i) {
        // Select the parent, retrive the 'rect' items and get the __data__ of
        // each one
        var parent = d3.select(d3.select(this).node().parentNode),
        items = parent.selectAll('rect')[0],
        parentData = items.map(function(r) { return r.__data__; });
        console.log(parentData);
        return i * 20;
    });

I would rather use the svg variable, but it's possible to do what you want. You can find out more about the attribute __data__ in the docs.

于 2013-05-24T21:33:23.083 回答