2015-10-07 151 views
1

我创建了一个简单的Angular/D3甜甜圈图表。动态加载角d3甜甜圈

Plunker:http://plnkr.co/edit/NyH1udkjBj3zymhGaThZ?p=preview

但是我希望图表对页面加载的动画。在这方面,我的意思是,我想填充(蓝色区域)的过渡

Somethign类似:http://codepen.io/tpalmer/pen/jqlFG/

HTML:

<div ng-app="app" ng-controller="Ctrl"> 
    <d3-donut radius="radius" percent="percent" text="text"></d3-donut> 
div> 

JS:

var app = angular.module('app', []); 
app.directive('d3Donut', function() { 
    return { 
    restrict: 'E', 
    scope: { 
     radius: '=', 
     percent: '=', 
     text: '=', 
    }, 
    link: function(scope, element, attrs) { 

     var radius = scope.radius; 
     var percent = scope.percent; 
     var text = scope.text; 

     var svg = d3.select(element[0]) 
     .append('svg') 
     .style('width', radius/2 + 'px') 
     .style('height', radius/2 + 'px'); 

     var donutScale = d3.scale.linear().domain([0, 100]).range([0, 2 * Math.PI]); 
     var color = "#5599aa"; 
     var data = [ 
     [0, 100, "#e2e2e2"], 
     [0, percent, color] 
     ]; 

     var arc = d3.svg.arc() 
     .innerRadius(radius/6) 
     .outerRadius(radius/4) 
     .startAngle(function(d) { 
      return donutScale(d[0]); 
     }) 
     .endAngle(function(d) { 
      return donutScale(d[1]); 
     }); 

     svg.selectAll("path") 
     .data(data) 
     .enter() 
     .append("path") 
     .attr("d", arc) 
     .style("fill", function(d) { 
      return d[2]; 
     }) 
     .attr("transform", "translate(" + radius/4 + "," + radius/4 + ")"); 

     svg.append("text") 
     .attr("x", radius/4) 
     .attr("y", radius/4) 
     .attr("dy", ".35em") 
     .attr("text-anchor", "middle") 
     .attr("font-size", "12px") 
     .style("fill", "#333") 
     .attr("text-anchor", "middle") 
     .text(text); 
    } 
    }; 
}); 

function Ctrl($scope) { 
    $scope.radius = 200; 
    $scope.percent = 50; 
    $scope.text = "40%"; 
} 

回答

1

我已经将您的代码与您引用的代码结合起来作为示例。这是一个工作PLUNK

有两两件事值得一提 - 1.使用attrTween

.attrTween("d", function (a) { 
    var i = d3.interpolate(this._current, a); 
    var i2 = d3.interpolate(progress, percent) 
    this._current = i(0); 
    console.log(this._current); 
    return function(t) { 
     text.text(format(i2(t)/100)); 
     return arc(i(t)); 
    }; 
}); 

2.更新数据:

data = [ 
    [0,100,"#e2e2e2"], 
    [0,percent,color] 
]; 

我不喜欢一个更地道使用的其他一些不太重要的变化控制器片段等,但以上是重要的。

+0

太棒了,谢谢! –

-1

Angular的“运行”命令会在这里帮助吗?

angular.module('app', []).run(myfunction($rootScope)) 

此页面上看到“运行” https://docs.angularjs.org/api/ng/type/angular.Module “的run()”会给你只一次性某某这样的功能的执行一次AngularJs已自举。