不能对 D3 v4 中的对象使用 attr

IT技术 javascript d3.js
2021-01-25 04:21:34

我一直在尝试使用新的 D3 v4将一个不错的 D3 图表示例(https://jsfiddle.net/thudfactor/HdwTH/)转换为 Angular2 组件。

但是,我使用以下代码收到“无法读取 null 的属性文本”异常:

var textLabels = labelGroups.append("text").attr({
    x: function (d, i) {
        var centroid = pied_arc.centroid(d);
        var midAngle = Math.atan2(centroid[1], centroid[0]);
        var x = Math.cos(midAngle) * cDim.labelRadius;
        var sign = (x > 0) ? 1 : -1
        var labelX = x + (5 * sign)
        return labelX;
    },
    y: function (d, i) {
        var centroid = pied_arc.centroid(d);
        var midAngle = Math.atan2(centroid[1], centroid[0]);
        var y = Math.sin(midAngle) * cDim.labelRadius;
        return y;
    },
    'text-anchor': function (d, i) {
        var centroid = pied_arc.centroid(d);
        var midAngle = Math.atan2(centroid[1], centroid[0]);
        var x = Math.cos(midAngle) * cDim.labelRadius;
        return (x > 0) ? "start" : "end";
    },
    'class': 'label-text'
}).text(function (d, i) {      <--------------- exception
    return d.data.label;
});

labelgroups 是一个选择, append 应该可以工作,所以它一定是.attr({})导致问题的原因。然而,它在 jsfiddle 中运行良好。

此语法在 D3 v4 中是否有所更改?怎么会是正确的?

1个回答

从 D3 v4 开始,您不能使用对象来设置attrstyle再使用。为此,您必须参考迷你库 D3-selection-multi:

<script src="https://d3js.org/d3-selection-multi.v0.4.min.js"></script>

这样做之后,将您的代码从 更改attrattrs(是的,就像一个复数):

var textLabels = labelGroups.append("text").attrs({
    //mind the 's' here-------------------------ˆ
});

对样式执行相同的操作:它应该是styles,作为复数,而不是style

如果你不想改变这一切,根本就作为“常规”方式:套xytext-anchorclass在不同的attr

这是selection-multi文档:https : //github.com/d3/d3-selection-multi/blob/master/README.md#selection_attrs

@Honghe.Wu 像这样: selection.attr("x", foo).attr("y", bar).attr("text-anchor", baz).attr("class", foobar);
2021-03-18 04:21:34
你能举个例子the "regular" way: set x, y吗?谢谢!
2021-03-22 04:21:34