【问题标题】:D3.js attrTween Returning Null (Unexpected Behavior)D3.js attrTween 返回 Null(意外行为)
【发布时间】:2013-11-25 21:13:59
【问题描述】:

我有一个非常基本的 D3 SVG,它基本上由几个弧组成。

无论我使用什么(attr、attrTween 和调用),我似乎都无法通过回调的第一个参数获取数据——它总是返回 null(我认为这是某种解析错误,即使路径渲染正确吗?)

我可能会忽略一些基本的东西,因为我对图书馆比较陌生...

var el      = $('#graph'),
                        width   = 280,
                        height  = 280,
                        twoPi   = Math.PI * 2,
                        total   = 0;

                    var arc = d3.svg.arc()
                        .startAngle(0)
                        .innerRadius(110)
                        .outerRadius(130),

                        svg = d3.select('#graph').append("svg")
                            .attr("width", width)
                            .attr("height", height)
                        .append("g")
                            .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")"),

                        meter = svg.append('g').attr('class', 'progress');

                    /* Add Meter Background */

                    meter.append('path')
                        .attr('class', 'background')
                        .attr('d', arc.endAngle(twoPi))
                        .attr('transform', 'rotate(180)');

                    /* Add in Icon */

                    meter.append('text')
                        .attr('text-anchor', 'middle')
                        .attr('class', 'fa fa-user')
                        .attr('y',30)
                        .text('')


                    /* Create Meter Progress */

                    var percentage  = 0.4,
                        foreground  = meter.append('path').attr('class', 'foreground')
                                        .attr('transform', 'rotate(180)')
                                        .attr('d', arc.endAngle(twoPi*percentage)),

                        setAngle    = function(transition, newAngle) {

                            transition.attrTween('d',     function(d,v,i) {
console.log(d,v,i)
                            });
                            /*transition.attrTween('d', function(d) { console.log(this)
                                var interpolate = d3.interpolate(d.endAngle, newAngle);
                                return function(t) { d.endAngle = interpolate(t); return arc(d); };
                            });*/

                        };


                    setTimeout(function() {
                        percentage = 0.8;
                        foreground.transition().call(setAngle, percentage*twoPi);
                    },2000);

似乎是这段代码有问题:

transition.attrTween('d', function(d,v,i) {
    console.log(d,v,i)
});

返回:

undefined 0 "M7.959941299845452e-15,-130A130,130 0 0,1 76.4120827980215,105.17220926874317L64.65637775217205,88.99186938124421A110,110 0 0,0 6.735334946023075e-15,-110Z"

我尝试使用插值器将 i 值解析为字符串,因为我似乎无法获取“d”,但是返回具有多个 NaN 的 d 属性时出现解析错误。

这一切看起来很奇怪,因为它是一个从弧计算出来的简单路径???

【问题讨论】:

    标签: javascript svg d3.js


    【解决方案1】:

    D3 中基本上所有回调的第一个参数(此处为d)是绑定到您正在操作的 DOM 元素的数据元素。在您的情况下,没有数据绑定到任何东西,因此 d 未定义。

    我已经更新了您的 jsfiddle here 以使过渡动画化并且更像饼图示例。要显示的百分比作为基准与路径绑定。然后您需要做的就是绑定新数据并以与任何饼图示例相同的方式创建补间:

    meter.select("path.foreground").datum(percentage)
         .transition().delay(2000).duration(750)
         .attrTween('d', function(d) {
           var interpolate = d3.interpolate(this._current, d);
           this._current = interpolate(0);
           return function(t) {
             return arc.endAngle(twoPi*interpolate(t))();
           };
    });
    

    【讨论】:

    • 抱歉有点愚蠢,但尽管有文档和教程,但我似乎无法掌握做到这一点的最佳方法......我假设我应该使用诸如 @ 之类的东西987654327@ 但是在实际绑定数据时,如何在简单的弧形动画上下文中完成?如果有我需要了解的关键背景,不反对稍微轻松阅读......
    • 好吧,你到底想做什么?如果你想做饼图,见this example
    • 好吧,我正在努力解决这个问题(几乎正是我想要的,虽然我想静态定义 endAngle 而不是基于进度回调)http://bl.ocks.org/mbostock/3750941...出于某种原因,我根本看不到那里明确使用的数据方法(仅设置 path d 属性),尽管我猜它在进度侦听器中的某个地方?
    • 我也意识到这可能已经过时了,因为我相信 tween 方法在 v3 中已被弃用?
    • 请注意,将.datum({ endAngle: twoPi*percentage }) 添加到前景弧可以解决d undefined 错误,但是仍然没有动画?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 2013-03-17
    相关资源
    最近更新 更多