2015-05-19 62 views
1

這裏有一個很棒的d3極點時鐘示例 - http://bl.ocks.org/mbostock/1096355d3 bl.ocks polar clock ex問題

如果有人願意花時間解釋他們,我有幾個問題關於發生了什麼。

1.

d3.transition().duration(0).each(tick); 

從文檔這實質上是相當於

d3.select(document).transition().duration(0).each(tick) 

所以應此最初控制文檔的過渡中,以查看?我試着給持續時間賦值> 0,它的行爲就像是延遲而不是動畫。我已經嘗試在tick fn中添加一些內容來控制動畫元素以查看,但它似乎決不會動畫。一個與僅僅調用tick()不同的工作示例會很有用。

2.

function tick() { 
    field = field 
     .each(function(d) { this._value = d.value; }) 
     .data(fields) 
     .each(function(d) { d.previousValue = this._value; }); 

這可能更有意義,如果我的理解1.然而較好的主要方面,我不明白的是如何「這個」正在使用。 d.value正被複制到this._value。 '這'是HTML DOM元素?我試過一個console.log(這個)直接在這行代碼下面,它沒有顯示任何_value屬性。 對這裏發生了什麼的解釋將不勝感激。這與d之間的根本區別尤其在於。

回答

1
  1. 在這種情況下,它的功能上等同於簡單的調用tick()(見modified example)。我可以看到使用d3.transition()的優點是,您將轉換中的一些元數據與文檔元素相關聯,而當您只是簡單地調用該函數時就不是這種情況。原則上,您可以使用此元數據來停止轉換,儘管在示例中它沒有被用於這種效果。

  2. dfield結合到g元素內的數據,而this指實際的DOM元素。在控制檯中無法看到,因爲在打印時不會評估打印的表達式,而是在展開時對其進行評估。也就是說,當你檢查控制檯時你所看到的並不是在打印值時出現的情況。

代碼的作用是什麼保存與DOM元素的先前值(作爲數據(d)正通過所述呼叫改變到.data()這是必要的),以便能夠爲不同的值之間的正確轉換(見例如this example用於需要訪問先前值的另一種情況)。

+0

*「您無法在控制檯中看到該內容,因爲打印的表達式在打印時並未進行評估,而是在展開時進行評估。」*這是不正確的。我已經在FF,IE11和Chrome的控制檯中檢查了這種行爲。所有這些都是在印刷時評估表達。因此,你可以使用'console.log(this.hasOwnProperty(「_ value」))'檢查是否存在,或者使用'console.log(this._value)'輸出值。 – altocumulus

+0

聽起來好像OP在記錄'this'並在稍後擴展它。 –

+0

完美,謝謝拉爾斯。 – hwilson1