2016-02-11 28 views
1

假設我有這樣的事情...在D3.JS,其中是位於d3.selection.data(MYDATA的)之後的數據?

var myData = [1, 2, 3, 4, 5]; 
var svg = d3.select("body").append("svg"); 
var initializeData = svg.selectAll("rect").data(myData); 

凡被存儲在對象initializeData數據(MYDATA的)?我無法在任何地方找到它。如果方法enter()使用myData中的數據,它必須在某處引用數據。

回答

3

看着source of data(),這很混亂,但從我所知道的,它將數據存儲在函數範圍內的變量中。

這意味着它不公開爲對象的屬性返回(更新),但仍然可以在裏面更新的功能,因爲它們即有機會獲得封閉範圍內封閉使用。

這是真的,我可以解釋它沒有得到太多的進入封閉和究竟是如何將數據功能達到最好效果。

+0

是不是他所說的進入()雖然之後?我在此之前詢問過。 – mute

+0

@沉默啊,是的,謝謝。我已經更新了我的答案 –

+0

哦好吧,這是一個很好的解釋(雖然我不是太過帶密封蓋熟悉)。謝謝! – mute

0

該數據實際上被綁定到的DOM元素。舉例來說,如果你綁定了一堆圈,你可以實際運行

d3.selectAll('.circle') 
    .each(function(d) { ... access element data .. }); 

做渲染後,當我用這個。你可以做的東西保存與事件與.on(function(d) { ...d is element data ..})

+0

如果有圓形元素需要綁定。我正在談論的情況是沒有當前的圓形元素,並且需要在enter()之後調用append()。奇怪的是,initializeData(在OP中)可以調用enter()並生成佔位符元素,但是當我檢查它時,initializeData對象似乎沒有任何(可見的)引用。 – mute

2

爲了增加@JosephYoung回答,是的,它存放在enter()函數中創建一個封閉。有了您的示例代碼上面,如果你console.log(initializeData),你可以檢查此:

enter image description here

+0

不知道你能Chrome的控制檯內查看關閉,非常酷 –