2015-02-24 51 views
0

我工作的一個簡單的D3力導向佈局的基礎上,Modifying a Force Layout例如,使用setTimeout回調的正常工作,採用更新的硬編碼的數據:修改強制佈局 - 使用索引,而不是引用給類型錯誤

enter image description here

然而,我將被動態地從服務器作爲JSON加載數據,所以想進入nodes陣列鏈路sourcetarget被指定爲索引,而不是實際的JavaScript節點對象的引用。該選項在documentation中描述;

注意:源和目標屬性的值最初可以是 指定爲節點數組中的索引;這些將在撥打電話後被替換爲 引用。

作爲第一步,我嘗試修改示例以使用索引;在下面的代碼片段:

var a = {id: "a"}, b = {id: "b"}, c = {id: "c"}; 
nodes.push(a, b, c); 
links.push({source: a, target: b},{source: a, target: c},{source: b, target: c}); 
start(); // joins the data, (re)starts the d3.layout.force 

我改變只是一個單一的線使用索引到的節點如下:

links.push({source: 0, target: 1},{source: 0, target: 2},{source: 1, target: 2}); 

然而,這會導致JavaScript錯誤從d3.v3.min.js(火狐35.0.1) :

TypeError: u is undefined 

和圖形僅部分創建的 - 所有3個節點被示出,但只有一個鏈接:

enter image description here

是否可以以這種方式使用索引?

+0

你想要的是肯定可能的。請參閱http://jsdatav.is/visuals.html?id=11550728。不知道你是如何觸發佈局。你只是在運行一個勾號? – 2015-02-24 16:57:12

+0

我以正常的方式將'tick'函數綁定到'd3.layout.force',如http://bl.ocks.org/mbostock/1095795所示,所以有多個ticks,圖形是動畫,即使它創建不正確。 – DNA 2015-02-24 17:00:58

+0

我錯過了開始佈局後更改數據的事實。拉斯是對的;你不能那樣做。 – 2015-02-24 17:58:41

回答

3

沒有,以這種方式使用指標是不可能與當前執行力佈局。當您開始佈局時,鏈接中的所有索引將被對象引用所替代(這就是文檔說您可以使用索引的原因,請參閱the source的第223-229行)。如果您在沒有(重新)啓動佈局的情況下推入索引,則此替換不會發生,並且代碼會中斷。

你有兩個選擇,使這項工作 - 無論是推引用節點的對象,或在每推後力佈局打電話.start()。請注意,對於後者,您還應該在推送前停止佈局,並且所有力量都將重新初始化,使得佈局在每次改變時都非常「跳躍」。

這聽起來像你的情況推引用Node對象,而不是指數將不會是一個問題,雖然,因爲你可以訪問節點的陣列。所有你需要做的就是在D3中進行索引。

+0

原始代碼已在每次push()後調用'start()' - 這在[原始示例](http://bl.ocks.org/mbostock/1095795)中顯示,但我會更新問題使這更明顯。 – DNA 2015-02-24 17:17:41

+0

是的,但它在更改鏈接之前並未停止佈局 - 數據已被修改但佈局尚未重新啓動時發生錯誤。 – 2015-02-24 17:21:16

+0

好的,我在每個setTimeout回調的開始處添加了'force.stop()',用於修改鏈接 - 但我遇到了完全相同的問題。 – DNA 2015-02-24 17:29:05

相關問題