2012-04-12 47 views
8

有關數據連接的快速問題。說我有一些元素,每個元素都包含一個。當我最初將數據加入到數據時,它會自動由我附加到輸入選擇的元素繼承。數據連接中的繼承

當數據發生變化,我重新綁定到我期待的元素會拿起新的數據,但這並沒有發生。

爲了解決這個問題,我需要在這樣的較低水平,明確重新綁定數據:

gElements.selectAll("circle") 
    .data(function(d) { return [d]; } 
    .enter().append("circle"); 

這既處理創建情況,並隨後重新綁定。但它似乎有點多餘,因爲返回[d]基本上是自動從父元素初始繼承數據時發生的。

這種方法是正確的方式來處理這個問題,或者我在這裏的某個地方感到困惑嗎?

回答

17

當您通過selection.data將數據綁定到元素時,它會更新綁定到這些元素的數據。然而,不是會自動將新數據傳播到後代元素;你必須自己做。

當您呼叫selection.select(與selection.append相對應)時,來自父項的數據將綁定到每個選定元素的選定子項。當您撥打selection.selectAll時,數據未被綁定,因此您必須隨後調用selection.data將新數據綁定到子級。

很難在沒有看到更多上下文的情況下回答您的問題。如果已經更新上gElements的數據,每個G元素包含一個圈,你可以使用selection.select從父g的數據傳播到子圈:

gElements.select("circle"); 

段,您寫了將僅用於代碼如果圓圈缺失,您想要創建一個新的圓。這在Thinking with Joins中描述。您要編寫的確切代碼可能取決於它是在輸入和更新時執行還是僅在更新時執行。

+0

是的,你說得對,我只有一個圈子每。我沒有意識到選擇導致數據繼承,但我在文檔中看到它實際上是這樣說的。 我覺得這有點違反直覺,因爲我一直認爲選擇作爲只讀操作的行爲,但是這種情況實際上會導致節點被修改。 – 2012-04-12 20:19:46