2015-06-20 73 views
0

我試圖找到正確的方式來動態生成路徑。我正在關注使用D3js創建SVG路徑的DashingD3js' patternD3js將路徑`d`屬性綁定到數據

我的問題是,除了檢查訪問器函數中的每個索引和操作值,並且除了創建表示要操縱的特定點的變量之外,是否有更簡單的方法來指定動態線座標?

我有我的對象數組中的路徑的座標。我很容易使用wh值使座標響應。

var lineData = [ {'x': 100, 'y': 0 }, {'x': w/2, 'y': -150 }, {'x': w/2, 'y': 150}, {'x': 100, 'y': 0}]; 

我已經能夠通過訪問函數像下面那樣操縱座標了。

var lineFunction = d3.svg.line() 
     .x(function(d, i) { 

      // function replacing lineData w/dynamic data 

      } 
      return d.x 
     }) 
     .y(function(d) { return d.y }) 
     .interpolate('linear'); 

以下是我引用的路徑:

myPath 
    .attr('d', function() { return lineFunction(lineData); }); 

是否有指定的動態座標線更簡單的方法?

回答

1

如果linedata數組中的某些值是動態的,那麼它們的值應該反映該值。

例如...

function f() {return w/2;}; //assuming w is updated asynchronously 
var lineData = [ {'x': 100, 'y': 0 }, {'x': f, 'y': -150 }, {'x': f, 'y': 150}, {'x': 100, 'y': 0}]; 

然後你只需要進行存取意識到,某些值是函數...

var lineFunction = d3.svg.line() 
.x(function(d, i) { 
    return typeof d.x === "function" ? d.x() : d.x; 
    }) 
.y(function(d) { return d.y }) 
.interpolate('linear'); 
+0

正是我一直在尋找。你有沒有在某處找到這個或者是你自己的實現? – Himmel

+1

對不起,我沒有參考,這只是我的想法,如何根據[公認原則](https://media.pragprog.com/articles/may_04_oo1.pdf)做到這一點。這裏的原則是「害羞」:有一個基於'w'的全局規則,只有'f'需要知道,'linedata'的一些成員接受這個全局值,但只有'linedata'需要知道哪些是爲了解析這些成員,'linefunction'需要知道一些成員是函數。所以你只需找出哪些物體需要知道什麼並從那裏拿走。 –