2014-03-04 49 views
0

我使用下面的代码为我的选择功能如何在d3中动态选择类?

quadrants = ["a", "b", "c", "d"]; 
for (var i in quadrants) 
{ 
    svgContainer.append("g").attr("class", quadrants[i]); 
    var group = d3.select(function() {return "." + quadrants[i]}); 

    group.append("polygon"); 
    ..... 
} 

这个自组的值不工作是“功能(){回报‘’ +象限[i]'。 我该如何解决这个问题,以便该组选择“.a”,“.b”等等?

+0

它是一个错字或你不关闭''{? –

+0

对不起,这是一个错字。固定。 – user3370384

回答

1

你忘了关{

而且,你并不需要使用的功能,下面的代码工作:

quadrants = ["a", "b", "c", "d"]; 
for (var i in quadrants) 
{ 
    //svgContainer.append("g").attr("class", quadrants[i]); 
    var group = d3.selectAll('.'+quadrants[i]); 
    group.text(function(){return i}); 
} 

其实用的功能是没有意义的。该函数的作用是动态地从变量中计算选择器。但是,使用d3.selectd3.selectAll时,没有任何内容会传递给该功能。

的jsfiddle:http://jsfiddle.net/hTnJq/1/

+0

或'var group = d3.select('。'+ quadrants [i]);' –

+0

非常感谢你...解决了它。你能告诉我为什么我不能在select()中使用函数。我是JS和D3的新手,所以这可能是一个noob问题。 – user3370384

+1

'select'也可以工作,但它只会选择与选择器对应的所有第一项。这不是你通常想要的课程。例如:http://jsfiddle.net/hTnJq/2/ –

0

它没有意义的使用功能在d3.selectd3.selectAll语句,因为你没有任何要素还作为函数的di价值的源泉使用。如果选择语句为nested selection like selection.selectAll(function),则只能使用该函数,在这种情况下,该函数中将使用父元素的数据和索引值。

但是,还有一个更优雅的方式做你想要做什么,通过使用D3 data joins

quadrants = ["a", "b", "c", "d"]; 

var group = svgContainer.selectAll("g") //define a selection of <g> elements 
       .data(quadrants); //declare that you want one <g> 
            //for each value in quadrants 

group.enter() //get the placeholder selection for the data objects 
       //that don't have matching elements yet 
    .append('g') //create the elements for each placeholder 
    .attr("class", function(d,i) { 
       //make the class a function of the data 
       //(which is the value from the quadrants array) 
       return d; 
      }); 

group.append("polygon"); //add a polygon to *each* <g> element 
+0

P.S.您可能还会发现[关于匿名函数的更长时间的讨论 - 作为参数](http://stackoverflow.com/questions/21358027/how-are-input-parameters-filled-in-javascript-method-chains/21421101#21421101 )是有用的。 – AmeliaBR