不能在D3 v4中使用带有对象的attr

Tom*_*myF 9 javascript d3.js

我一直试图将一个漂亮的D3图表示例(https://jsfiddle.net/thudfactor/HdwTH/)转换为带有新D3 v4的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;
});
Run Code Online (Sandbox Code Playgroud)

labelgroups是一个选择,append应该工作,所以它必须是.attr({})导致问题.然而它确实在jsfiddle中工作正常.
D3 v4中是否更改了此语法?怎么会这么正确?

谢谢!

Ger*_*ado 22

在D3 v4(以及v5)中,您不能使用对象来设置attrstyle.为此,您必须参考迷你库D3-selection-multi:

<script src="https://d3js.org/d3-selection-multi.v0.4.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

完成后,将代码更改attrattrs(是,像复数):

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

对样式做同样的事情:它应该是styles复数,而不是style.

如果你不想改变这一切,根本就作为"常规"方式:套x,y,text-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);` (2认同)