使用setInterval和d3js更新值

时间:2014-03-11 20:07:19

标签: d3.js

我不确定这个问题是不是一团糟。拜托,如果有人可以告诉我一些事情,我会非常感激。

我尝试更新使用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路径)。但我无法理解为什么它表现不同。我打电话给不同的对象吗?

1 个答案:

答案 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()的返回值。