我不确定这个问题是不是一团糟。拜托,如果有人可以告诉我一些事情,我会非常感激。
我尝试更新使用d3js绘制的现有弧:
var arc = d3.svg.arc()
.startAngle(0)
.innerRadius(70)
.outerRadius(100);
setInterval(function(){ change(); },3000);
function change() {
var x = d3.selectAll("some_entity")
.data(data)
.attr("d", arc.endAngle(twoPi * 0.7) )
.attr("class", function(d) { return d.some_field });
}
此代码完全按预期工作。 " Some_entities"如果选择了数据,则设置数据,绘制70%的弧,并使用相应的数据填充类属性。如果我改变了" d"要根据以下数据绘制的属性:
function change() {
var x = d3.selectAll("some_entity")
.data(data)
.attr("d", function(d) { return arc.endAngle(twoPi * d.progress); } )
.attr("class", function(d) { return d.some_field });
}
发生了一些奇怪的事情。抛出此错误:
Error: Problem parsing d="function n(){var n=t.apply(this,arguments),i=e.apply(this,arguments),o=r.apply(this,arguments)+ys,a=u.apply(this,arguments)+ys,c=(o>a&&(c=o,o=a,a=c),a-o),s=Sa>c?"0":"1",l=Math.cos(o),...
就像电弧功能根本没有被评估一样!返回函数体(或类似的东西)。我不知道这是否是由于该功能的背景。我尝试过不同的方法,例如尝试将弧存储在更全局的上下文中,或者重新创建内部的对象,但没有任何作用。
如果我评估函数它实际上返回一个弧(相应的svg路径)。但我无法理解为什么它表现不同。我打电话给不同的对象吗?
答案 0 :(得分:2)
如果你仔细观察,你会发现非工作电话是在一个功能中,而工作电话则不是:
.attr("d", arc.endAngle(twoPi * 0.7) ) // working
.attr("d", function(d) { return arc.endAngle(twoPi * d.progress); } ) // not working
如果您没有显式声明函数,Javascript会遍历参数。因此,为了使它能够使用显式函数,您需要通过显式传递参数:
.attr("d", function(d) { return arc.endAngle(twoPi * d.progress)(d); } )
这就是您收到的错误消息告诉您 - 您确实正在返回未评估的函数,这是arc.endAngle()
的返回值。