如何在D3中链接函数调用?

时间:2015-04-14 22:17:16

标签: javascript d3.js

定义了一个draw函数以便重用,但它是独立的语句。

draw(circles);

有没有办法将(重写)绘制函数放回D3的函数链?

svg.selectAll("circle")
            .data(dataset)
            .enter()
            .append("circle")
            .draw(???) //not work. 

这是代码。工作版本为here

<body>
    <script type="text/javascript">

        var draw = function (circles) {
            circles.attr("cx", function (d, i) {
                return (i * 50) + 25;
            })
         .attr("cy", h / 2)
         .attr("r", function (d) {
            return d;
         });
        };

        var w = 500, h = 50;

        var dataset = [5, 10, 15, 20, 25];
        var dataset2 = [25, 20, 15, 10, 5];

        var svg = d3.select("body")
                    .append("svg")
                    .attr("width", w)
                    .attr("height", h);

        var circles = svg.selectAll("circle")
            .data(dataset)
            .enter()
            .append("circle")

        draw(circles);

        var circles2 = svg.selectAll("circle")
        .data(dataset2)
        .transition()
        .duration(2000);

        draw(circles2);

    </script>
</body>

1 个答案:

答案 0 :(得分:2)

在draw()中使用call()+ this。 工作版本为here

var draw = function () {
    this.attr("cx", function (d, i) {
        return (i * 50) + 25;
    })
    .attr("cy", h / 2)
    .attr("r", function (d) {
        return d;
    });
};

circles
.data(dataset)
.enter()
.append("circle")
.call(draw)
.data(dataset2)
.transition()
.attr("fill", "red")
.duration(2000)
.call(draw);