【 D3.js 选择集与数据详解 — 5 】 处理模板的应用

1. 模板

[javascript]  view plain  copy
  1. //绑定数据后,分别返回update、enter、exit部分  
  2. var update = selection.data(dataset);  
  3. var enter = update.enter();  
  4. var exit = update.exit();  
  5.   
  6. //1.update部分的处理方法  
  7. update.text( function(d){ return d; } );  
  8.   
  9. //2.enter部分的处理方法  
  10. enter.append("p")  
  11.     .text( function(d){ return d; } );  
  12.   
  13. //3.exit部分的处理方法  
  14. exit.remove();  

2. 应用模板的场合

当数据需要更新(添加、删除、变更)的时候,要想起此模板。

3. 应该该模板的柱形图

下面制作一个柱形图,用于理解更新数据与使用该模板的好处。柱形图的数据有时候需要更新,更新后柱形图也需要跟着变化。例如将数据排序、增加新的数据等,都需要柱形图跟着变化。在这里只绘制柱形图的矩形和文字,不绘制坐标轴,然后再添加两个按钮,用于更新数据。将绘制图形的代码写在一个函数draw()里,当数据发生更新时,再次调用此函数即可。

[javascript]  view plain  copy
  1. function draw(){  
  2.     //获取矩形的update部分  
  3.     var updateRect = svg.selectAll("rect")  
  4.                     .data(dataset);  
  5.       
  6.     //获取矩形的enter部分  
  7.     var enterRect = updateRect.enter();  
  8.       
  9.     //获取矩形的exit部分  
  10.     var exitRect = updateRect.exit();  
  11.       
  12.     //1. 矩形的update部分的处理方法  
  13.       
  14.     //2. 矩形的enter部分的处理方法  
  15.       
  16.     //3. 矩形的exit部分的处理方法  
  17.               
  18.     //获取文字的update部分  
  19.     var updateText = svg.selectAll("text")  
  20.                     .data(dataset);  
  21.       
  22.     //获取文字的enter部分  
  23.     var enterText = updateText.enter();  
  24.       
  25.     //获取文字的exit部分  
  26.     var exitText = updateText.exit();  
  27.       
  28.     //1. 文字的update部分的处理方法  
  29.       
  30.     //2. 文字的enter部分的处理方法  
  31.       
  32.     //3. 文字的exit部分的处理方法  
  33. }  

上述模板中,分别获取矩形和文字的update、enter、exit三个部分。然后再分别对三个部分进行相应的处理。下面以矩形为例,来讲解怎么样分别处理。代码如下:

[javascript]  view plain  copy
  1. //1. 矩形的update部分的处理方法  
  2. updateRect.attr("fill","steelblue")     //设置颜色为steelblue  
  3.         .attr("x"function(d,i){       //设置矩形的x坐标  
  4.             return padding.left + i * rectStep;  
  5.         })  
  6.         .attr("y"function(d){     //设置矩形的y坐标  
  7.             return height- padding.bottom - d;  
  8.         })  
  9.         .attr("width",rectWidth)        //设置矩形的宽度  
  10.         .attr("height",function(d){ //设置矩形的高度  
  11.             return d;  
  12.         });  
  13.       
  14. //2. 矩形的enter部分的处理方法  
  15. enterRect.append("rect")  
  16.         .attr("fill","steelblue")       //设置颜色为steelblue  
  17.         .attr("x"function(d,i){       //设置矩形的x坐标  
  18.             return padding.left + i * rectStep;  
  19.         })  
  20.         .attr("y"function(d){     //设置矩形的y坐标  
  21.             return height- padding.bottom - d;  
  22.         })  
  23.         .attr("width",rectWidth)        //设置矩形的宽度  
  24.         .attr("height",function(d){ //设置矩形的高度  
  25.             return d;  
  26.         });  
  27.       
  28.     //3. 矩形的exit部分的处理方法  
  29.     exitRect.remove();  

update部分的处理方法是更新属性,enter部分的处理方法是添加元素后再赋予其相应的属性,exit部分的处理方法则是删除掉多余的元素。这么处理之后,对于原数组dataset,无论是排序还是增减数据,图表都能够自动发生相应变化。下面在HTML中分别添加两个按钮,一个用于排序,一个用于增加数据。在HTML中的里添加以下两个按钮:

[javascript]  view plain  copy
  1. <button type="button">排序</button>  
  2. <button type="button">增加数据</button>  

给两个按钮的定义了两个事件函数,但单击事件发生时,分别调用mysort()和myadd()。这两个函数的实现很简单,只要将数据处理后,再调用一次draw()重绘一次即可。

[javascript]  view plain  copy
  1. function mysort(){  
  2.     dataset.sort(d3.ascending); //排序  
  3.     draw();  
  4. }  
  5.   
  6. function myadd(){  
  7.     dataset.push( Math.floor(Math.random() * 100) );    //添加一个项  
  8.     draw();  
  9. }  

由于边界有限,增加多个数据后矩形会在边界之外,但是不妨碍本文要表达的意思。

源代码可打开下面网址后,右键查看源代码:

http://www.ourd3js.com/demo/template.html



猜你喜欢

转载自blog.csdn.net/u010238381/article/details/80608970