我正在使用 D3.js 进行圆环图可视化。我创建了一个指令myWheel
,并在链接函数中$watch
更改了-elementval
上的属性。<my-wheel>
每次数据更新时,可视化都应该使用转换进行更新,这可以正常工作,但第一次转换会被忽略。看到这个笨蛋。
如果我延迟(延迟$timeout
)数据的第一次更新,则会触发转换。
关于问题出在哪里的任何想法?
在创建路径时,您可以selection.each
调用donutDataSlice
该集合this._current
到基准的输入选择。这意味着当你进入arcDataTween
第一次时,this._current
和a
值都是一样的。所以插值器第一次没有做任何事情。
还有其他几个问题。在arcDataTween
你有这个:
function arcDataTween(a) {
var i = d3.interpolate(this._current, a);
this._current = i(0);
return function(t) {
return arcData(i(t));
};
}
您正在this._current
用作插值器的起始值,但随后您正在设置this._current = i(0)
. 使用 0 调用插值器将返回起始值,因此this._current
每次运行 arcDataTween 时基本上都设置为相同的值。您可能想要的是设置this_current = a
(或等效地,this._current = i(1)
)。
作为关于命名约定的一个小说明,自定义补间中的第一个参数实际上是基准,因此通常用 表示d
。使用a
它可能会造成混淆,因为第三个参数是元素的当前属性或样式值,通常表示为a
(例如function arcDataTween(d, i, a) {}
)。
最后,您的初始数据的 ascore
为零,并且由于您将score
其用作饼图布局的值,因此在某些情况下,这将为 startAngle 和 endAngle 返回 NaN。我不确定这在视觉上会产生什么影响,但这可能不是您想要的。饼图布局的值访问器应始终返回一个数字,该数字表示该段所代表的饼图的比例。在计算段值之前过滤掉分数为 0 的数据可能会更好,以避免出现 NaN 角。