为什么我保存的D3选择在某些情况下没有效果

Why does my saved D3 selection have no effect in some cases?

本文关键字:情况下 有效果 选择 保存 D3 为什么      更新时间:2023-09-26

我对如何保存D3选择供以后使用感到困惑。在下面的代码中,我为坐标轴设置了一个"全局"变量,在第一次创建坐标轴时将它们保存到该变量中。后来,我能够将这个变量用于某些事情(这里,设置一些文本),但不能用于其他事情(这里,更新比例),这只有在我显式地(重新)选择坐标轴时才能工作。

可能有一些关于JavaScript变量作用域或生命周期,我不明白吗?感谢任何帮助!


相关代码,从完整的上下文中浓缩而来:

// Top level of page
var gxaxis, gyaxis;
var updatePlot = function (view, first) {
    d3.csv("data.csv", function (error, data) {
        data.forEach(function (d) {
            ...
        });
        var x, y;
        x = d3.scale.linear().range(...);
        y = d3.scale.linear().range(...);
        x.domain(d3.extent(data, function (d) {...})).nice();
        y.domain(d3.extent(data, function (d) {...})).nice();
        var xAxis = d3.svg.axis().scale(x).orient("bottom");
        var yAxis = d3.svg.axis().scale(y).orient("left");
        // The variable 'first' is true on page load, so this code the if clause will be executed before any executions of the else clause
       if (first) {
            gxaxis = svg.append("g").attr("class", "x axis")
                    .attr("transform", "translate(0," + height + ")")
                    .call(xAxis)
                    .append("text")
                    .attr("class", "label")
                    .attr("x", width)
                    .attr("y", -6)
                    .style("text-anchor", "end");
            gyaxis = svg.append("g").attr("class", "y axis")
                    .call(yAxis)
                    .append("text")
                    .attr("class", "label")
                    .attr("transform", "rotate(-90)")
                    .attr("y", 6)
                    .attr("dy", ".71em")
                    .style("text-anchor", "end");
        } else {
            // Why is it necessary to explicitly select; why can't I use my gxaxis variable (as I do below for the text)?
            svg.select(".x.axis")
                    .transition().duration(0).ease("in")
                    .call(xAxis);
            // Using gyaxis.transition()... has NO EFFECT
            svg.select(".y.axis")
                    .transition().duration(0).ease("in")
                    .call(yAxis);
        }
        var xLabel = ...;
        var yLabel = ...;
        // This use of gxaxis works.
        gxaxis.text(xLabel);
        gyaxis.text(yLabel);
    });
};
// Set up handlers for switching among views
d3.selectAll(".view-select").on("click", function () {
    d3.event.preventDefault();
    updatePlot(this.id, false);
});
updatePlot('a', true);

代码:

gxaxis = svg.append("g").attr("class", "x axis")
                .attr("transform", "translate(0," + height + ")")
                .call(xAxis)
                .append("text")
                .attr("class", "label")
                .attr("x", width)
                .attr("y", -6)
                .style("text-anchor", "end");

创建这个DOM:

<svg>
    <...>
        <g class="x axis">
            <g class="tick">
                <line ...>
                <text ...>
            </g>
        </g>
    </...>
</svg>

并将text保存到选区中,因为它是最后添加的。
如果你想要坐标轴,在编辑文本之前保存坐标轴。

gxaxis = svg.append("g").attr("class", "x axis")
                .attr("transform", "translate(0," + height + ")")
                .call(xAxis);
gxaxis.selectAll("text")
                .attr("class", "label")
                .attr("x", width)
                .attr("y", -6)
                .style("text-anchor", "end");
相关文章: