2013-10-15 89 views
1

這可能是使用d3js創建的最簡單的圖表。但我正在掙扎。D3js PieChart不會執行更新部分

該圖在enter()和exit()中運行給它的所有內容。但是,ENTER + UPDATE中的所有內容都被完全忽略。爲什麼?

// Setup dimensions 
var width = 200, 
    height = 200, 
    radius = Math.min(width, height)/2, 

// Setup a color function with 20 colors to use in the graph 
    color = d3.scale.category20(), 

// Configure pie container 
    arc = d3.svg.arc().outerRadius(radius - 10).innerRadius(0), // Define the arc element 
    svg = d3.select(".pie").append("svg:svg") 
     .attr("width", width) 
     .attr("height", height) 
     .append("g") 
     .attr("transform", "translate(" + width/2 + "," + height/2 + ")"), 

// This is the layout manager for the pieGraph 
    pie = d3.layout.pie() 
     .sort(null) 
     .value(function (d) { 
      return d.answers; 
     }), 

// Allow two groups in the container. One overlapping the other, just to make sure that 
// text labels never get hidden below pie arcs. 
    graphGroup = svg.append("svg:g").attr("class", "graphGroup"), 
    textGroup = svg.append("svg:g").attr("class", "labelGroup"); 

// Data is loaded upon user interaction. On angular $scope update, refresh graph... 
$scope.$watch('answers', function (data) { 
    // === DATA ENTER =================== 
    var g = graphGroup.selectAll("path.arc").data(pie(data)), 
     gEnter = g.enter() 
      .append("path") 
      .attr("d", arc) 
      .attr("class", "arc"), 

     t = textGroup.selectAll("text.label").data(data), 
     tEnter = t.enter() 
      .append("text") 
      .attr("class", "label") 
      .attr("dy", ".35em") 
      .style("text-anchor", "middle"); 

    // === ENTER + UPDATE ================ 
    g.select("path.arc") 
     .attr("id", function (d) { 
      return d.data.id + "_" + d.data.selection; 
     }) 
     .attr("fill", function (d, i) { 
      return color(i); 
     }) 
     .transition().duration(750).attrTween("d", function (d) { 
      var i = d3.interpolate(this._current, d); 
      this._current = i(0); 
      return function (t) { 
       return arc(i(t)); 
      }; 
     }); 
    t.select("text.label") 
     .attr("transform", function (d) { 
      return "translate(" + arc.centroid(d) + ")"; 
     }) 
     .text(function (d) { 
      return d.data.opt; 
     }); 

    // === EXIT ========================== 
    g.exit().remove(); 
    t.exit().remove(); 
}); 

給予更新功能爲「數據」的JSON結構的一個例子:

[{"selection":"0","opt":"1-2 timer","answers":"7"}, 
{"selection":"1","opt":"3-4 timer","answers":"13"}, 
{"selection":"2","opt":"5-6 timer","answers":"5"}, 
{"selection":"3","opt":"7-8 timer","answers":"8"}, 
{"selection":"4","opt":"9-10 timer","answers":"7"}, 
{"selection":"5","opt":"11 timer eller mer","answers":"11"}, 
{"selection":"255","opt":"Blank","answers":"8"}] 

回答

3

你不需要額外的.select()訪問更新的選擇。這實際上會在您的情況下返回空選項,這意味着什麼都不會發生。爲了使其工作,只需擺脫額外的.select()和做

g.attr("id", function (d) { 
     return d.data.id + "_" + d.data.selection; 
    }) 
// etc 

t.attr("transform", function (d) { 
     return "translate(" + arc.centroid(d) + ")"; 
    }) 
// etc 
+0

這實際上工作很好,但爲什麼不會轉換運行? –

+0

我接受了這個答案,因爲它解決了這個問題。我想我將不得不進一步關注轉換問題,我猜想這個問題不在這個問題範圍之內。 –

+0

轉換不起作用? –