我正在使用D3库v4和Angular2,我想要拖放svg元素。我有一个代码:
item.call(
d3.drag()
.on("start", dragStarted)
.on("drag", dragged)
.on("end", dragEnded)
);
和
function dragStarted(d) {
d3.select(this).raise().classed("active", true);
}
function dragged(d) {
d3.select(this).attr("cx", d.x = d3.event.x).attr("cy", d.y = d3.event.y);
}
function dragEnded(d) {
d3.select(this).classed("active", false);
}
我收到此错误:
TS2345:类型' DragBehavior'不能分配给'类型的参数(选择:选择,... args:any [])=>无效&#39 ;. 参数类型'选择'和选择'是不相容的。 输入'选择'不能分配类型'选择'。 输入' BaseType'不能分配给'元素'。 输入' EnterElement'不能分配给'元素'。 财产' classList'类型' EnterElement'中缺少。
有什么想法吗?
答案 0 :(得分:2)
我尝试使用this sample中的代码,但它显示相同的错误。 我用另一种方式写它:
svg.selectAll("circle")
.data(circles)
.enter().append("circle")
.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; })
.attr("r", radius)
.style("fill", 'blue');
svg.selectAll("circle").call(d3.drag().on("start", dragstarted)
.on("drag", dragged)
.on("end", dragended));
它对我有用。
答案 1 :(得分:1)
答案 2 :(得分:0)
我仍然不确定既避免编译错误又避免伪造类型系统的最正确方法是什么?但是,即使按照以下方式,它似乎也能正常工作:
this.svgGraph
.append('line')
.call(d3.drag<SVGLineElement, unknown>()
.on('drag', this.dragged())
);
因此“强制” SVGLineElement类型。
你怎么看?