例如,在html <table>
中,<tr>
可能包含<th>
和<td>
。你將如何將數據綁定到行選擇,將創建偶數列爲<th>
和奇數爲<td>
?在d3中,如何爲數據創建不同的元素?
回答
所以,這似乎也不完美,但總是有html()方法。
var d = [['a','b','c','d']];
var r = d3.select('#myTable').selectAll('tr')
.data(d);
r.enter().append('tr').html(function(d) {
var i, s = '';
for (i = 0; i < d.length; i += 1) {
s += (i%2===0) ? '<th>' : '<td>';
s += d[i];
s += (i%2===0) ? '</th>' : '</td>';
}
return s;
});
我能想出是通過基於數據的索引應用類製作<td>
看起來像一個<th>
最好的:
var d = ['a','b','c','d','e','f','g'];
var tr = d3.select("#myTableRow").selectAll("td")
.data(d).enter().append("td")
.text(function(d) { return d; })
.classed("thLike", function(d,i) { return i%2===0; });
CSS:
.thLike {
font-weight: bold;
}
謝謝你,是的,這可對許多情況來說,這是一個有用的解決方法,但是也存在語義差異,並且'table'情況就是一個例子。我懷疑可能沒有任何解決方案。 –
據我所知,你是對的 - 在標準D3成語中沒有辦法做到這一點。據推測,這將有可能一旦selection.append()
可以採取的功能:
選擇。 追加(名)
與追加指定名稱的新元素......名稱必須指定爲常數,但在未來,我們可能會允許現有要素的追加或生成名稱的函數動態。
希望這樣的功能可以採用標準的(data, index)
參數,並且可以解決這個問題。否則,目前,我無法從單個.enter()
選擇中創建不同的元素 - .enter()
僅支持.append
,.insert
和.select
,其中沒有一個可以接受函數參數。
您可以通過改寫(munging)數據到元組,並得到一些你想要的雙附加到.enter()
選擇,如下所示:http://jsfiddle.net/xuJ6w/4/
// munge data
var tuples = data.map(function(row) {
var newRow = [],
x;
// create array of objects
for (x=0; x<row.length; x+=2) {
newRow.push({
label: row[x],
value: row[x+1]
})
}
return newRow;
});
var rows = d3.select('table').selectAll('tr')
.data(tuples);
rows.enter().append('tr');
var cellPairs = rows.selectAll('.cell')
.data(function(d) { return d; });
var entry = cellPairs.enter();
entry.append('th')
.attr('class', 'cell')
.text(function(d) {
return d.label;
});
entry.insert('td', 'th + th')
.attr('class', 'cell')
.text(function(d) {
return d.value;
});
但你可以看到,當更新被稱爲:
cellPairs
.style('background', '#CCC');
只有最後添加的節點被更新,所以數據還沒有被完全綁定。
https://github.com/mbostock/d3/wiki/Selections#wiki-data
選擇器也可以相交( 「.this.that」 爲邏輯與)或 聯合在一起( 「這,。那」 邏輯OR)。
所以,像這樣的東西可能適合你。我還沒有測試,但(如果選擇不工作,你可以添加同一類到每個TD/TH細胞,並選擇與TR .myClass
):
var cells = tableRow.selectAll("TD, TH").data(data);
cells.enter().each(d, i) {
var cell = d3.select(this);
cell.append(i%2 ? "TD" : "TH");
})
我試過了,但''輸入'上的'each'不起作用。 - 「輸入選擇只定義追加,插入和選擇操作符」 –
我會提出一個問題/增強與D3。除了其他答案提供的解決方法外,我沒有看到其他解決方法。 – Glenn
- 1. 如何根據D3中的數據創建元素?
- 2. 在d3中爲datalist創建元素
- 3. d3.js爲每個數據點創建兩個元素
- 4. 在XSD中創建不同的元素
- 5. 創建空元素,d3.js
- 6. 在數據幀的不同行的元素創建變量
- 7. D3根據兩個不同的數據集更改元素?
- 8. d3.js意想不到的行爲創建和輸入元素
- 9. 在jQuery中爲兩個不同的元素創建相同的事件(不是爲每個元素都爲!)
- 10. 使用自定義函數在d3.js中創建元素
- 11. 如何添加數據到在XSLT中創建的元素
- 12. D3 - 如何在懸停從相同數據條目的不同屬性創建的圓形元素時顯示/隱藏文本元素?
- 13. 在Fortran中使用不同類型的元素創建數組
- 14. d3.js基於數據值附加不同的SVG元素
- 15. laravel創建具有不同數據的select元素
- 16. 使用數據集中的d3.js,在svg的g元素中添加兩個不同的svg元素
- 17. 如何爲ArrayList的元素創建JCheckBox
- 18. d3從svg元素中選擇數據
- 19. 在d3中爲每個數據元素添加多個矩形
- 20. 如何在Qt中創建HTML元素?
- 21. 如何在XML中創建新元素?
- 22. 如何在數組中創建一個空元素被認爲不存在?
- 23. 如何創建位於不同div的元素的html集合
- 24. D3:如何創建輸入元素後跟標籤文本?
- 25. 在不同的元素上創建多個數組
- 26. D3:可以創建元素的一個子集,但不會更新元素
- 27. 爲什麼在創建DOM元素時不存在DOM元素?
- 28. 如何爲HTML DOM元素創建XPATH?
- 29. d3.nest()巢數組元素與多個同級別的密鑰(創建副本)
- 30. 如何動態創建具有不同ID的輸入元素?
因爲用不同的元素類型實現數據綁定似乎是不可能的,所以這種方式似乎是放棄d3在列上的好方法,仍然將它用於行,並獲得所需的結果。通過使用'each'而不是'html',你甚至可以在解決方法中繼續使用d3。 –