Twitter bootstrap 使用函数将类附加到现有的.div

Twitter bootstrap 使用函数将类附加到现有的.div,twitter-bootstrap,d3.js,Twitter Bootstrap,D3.js,我又遇到了一个问题,所以我想我应该发布完整的函数。在本例中,函数作为JSON关联数组传递,其中嵌入了数组waferId DETAILWAVE和htmlData。我已经能够附加waferId信息,并且仍然难以将htmlData键分配为类,即使有建议的更改,我也无法正确绑定DETAILWAFE x和y数据。从值的外观来看,在执行xScale和yScale之后,值都会在一个位置显示出来,大致对应于x和y的0。当我在Firebug中查看JSON中的x和y值时,它们不是零。我不确定作为+d.y和+d.x传

我又遇到了一个问题,所以我想我应该发布完整的函数。在本例中,函数作为JSON关联数组传递,其中嵌入了数组waferId DETAILWAVE和htmlData。我已经能够附加waferId信息,并且仍然难以将htmlData键分配为类,即使有建议的更改,我也无法正确绑定DETAILWAFE x和y数据。从值的外观来看,在执行xScale和yScale之后,值都会在一个位置显示出来,大致对应于x和y的0。当我在Firebug中查看JSON中的x和y值时,它们不是零。我不确定作为+d.y和+d.x传递它们是否足以强制它们作为整数,也许这就是我的问题

function buildSlides(data) {
//Constants
var squareSide = 400;
var triangleWidth = 6;
var wafer_center_x = 150027042;
var wafer_center_y = 150187625;
var wafer_scale = 1000000;

//Triangle data
var triangleData = [
    {"x":squareSide / 2 - triangleWidth / 2, "y":squareSide},
    {"x":squareSide / 2, "y":squareSide - triangleWidth},
    {"x":squareSide / 2 + triangleWidth / 2, "y":squareSide},
    {"x":squareSide / 2 - triangleWidth / 2, "y":squareSide}
];
//Create x and y scale
var xScale = d3.scale.linear()
    .domain([-wafer_center_x ,wafer_center_x])
    .range([0, squareSide]);

var yScale = d3.scale.linear()
    .domain([-wafer_center_y,wafer_center_y])
    .range([squareSide,0]);

//line function for triangle path
var lineFunction = d3.svg.line()
    .x(function(d) {return d.x;})
    .y(function(d) {return d.y;})
    .interpolate("linear");

//begin building bootstrap courousel stack
var slides = d3.select(".carousel-inner").selectAll("div")
    .data(data)
    .enter()
    .append("div")
    .attr("class","item")
    .attr("id",function(data) {return data.waferId;})
    .append("div")
    .attr("class","container-fluid")
    .append("div")
    .attr("class","row");

//Make the first slide the active slide
d3.selectAll(".item").classed('active', function(d, i) { return i == 0; });

//Build the image side of the slide
var imageSide = slides.append("div")
    .attr("class","col-lg-6 wafer-and-pareto");

//Build the html side of the slide
var htmlSide = slides.append("div")
    .attr("class","col-lg-6 wafer-info");

//Build final location for div that holds svg waferMap
var waferBox = imageSide.append("div")
    .attr("class","row")
    .append("div")
    .attr("class","col-lg-12")
    .append("div")
    .attr("class","wafer-box")
    .append("svg")
    .attr("class","waferMap")
    .attr("width", squareSide)
    .attr("height",squareSide);

//Add the triangle at the bottom
var triangle = waferBox.append("path")
    .attr("d",lineFunction(triangleData))
    .attr("stroke","gray")
    .attr("stroke-width",1)
    .attr("fill","black");

//Draw a round wafer
var wafer = waferBox.append("ellipse")
    .attr("cx",xScale(wafer_center_x / wafer_scale))
    .attr("rx",xScale(wafer_center_x / wafer_scale))
    .attr("cy",yScale(wafer_center_y / wafer_scale))
    .attr("ry",yScale(wafer_center_y / wafer_scale))
    .attr("fill","none")
    .attr("stroke","gray")
    .attr("stroke-width",1);

//Add data points to wafer map
var circle = waferBox.selectAll("circle")
    .data(function(data) {return data.detailWafer;})
    .enter()
    .append("circle")
    .attr("cx", function(d) {
        return xScale(+d.x);})
    .attr("cy", function(d) {
        return yScale(+d.y);})
    .attr("r",1);

//build final location for div that will hold the histogram
var paretoBox = imageSide.append("div")
    .attr("class","row")
    .append("div")
    .attr("class","col-lg-12")
    .append("div")
    .attr("class","pareto-box")
    .append("svg")
    .attr("class","chart");

//Add data to the html side
var waferLabels = htmlSide.append("div")
    .attr("class","col-lg-6");

var labelList = waferLabels.selectAll("div")
    .data(function(data){return d3.keys(data.htmlData);})
    .enter()
    .append("div")
    .attr("class","htmlLabel")
    .text(function(d){return d;});

var waferValues = htmlSide.append("div")
    .attr("class","col-lg-6");

var waferList = waferValues.selectAll("div")
    .data(function(data) {return d3.values(data.htmlData);})
    .enter()
    .append("div")
    .attr("class","htmlValue")
    .text(function(data){return data;});

var classes = {};

d3.keys(data.htmlData).forEach(function(d) {
    classes[d] = true;
});

d3.selectAll(".htmlValue")
    .data(function(data) {return d3.keys(data.htmlData);})
    .enter()
    .classed(classes);
}

来自:

如果要同时设置多个类,请使用如下对象文字:selection.classed{'foo':true,'bar':false}

在你的情况下,这看起来像这样

var classes = {};
d3.keys(data.htmlData).forEach(function(d) {
  classes[d] = true;
});

d3.selectAll(".htmlValue")
  .data(function(data) {return d3.keys(data.htmlData);})
  .enter()
  .classed(classes);

经过进一步的调查,我发现我的JSON数组的值偏离了1000倍,这就是我的刻度恢复到接近0的原因

对于将标签添加为类,我无法使解决方案起作用,但我决定不需要将其作为类,因此我根据以下内容将其绑定为自定义数据属性:

 var waferList = waferValues.selectAll("div")
    .data(function(data) {return d3.values(data.htmlData);})
    .enter()
    .append("div")
    .attr("class","htmlValue")
    .text(function(data){return data;})
    .data(function(data){return d3.keys(data.htmlData)})
    .attr("data-htmlLabel",function(data){return data});

我不确定我错过了什么。我在waferList变量之后添加了以下内容