2017-03-05 94 views
2

在D3,以將對象移動到一個指定的位置,它通常與進行:(?或方法)如何將d3「翻譯」成功能?

g_x.attr("transform", "translate(" + x + "," + y + ")"); 

我怎樣才能彎曲成一個函數調用,可以像這樣使用:

g_x.move(x, y); 

回答

3

一種選擇是擴展D3原型,我敢肯定有人會很快發佈一個答案。

但是,我認爲,最簡單的解決方案是使用call,其中:

調用指定的功能只出現一次,在本次評選經過任何可選參數一起。

所以,你的情況,讓我們創建一個名爲move功能:

function move(selection, x, y) { 
    selection.attr("transform", "translate(" + x + "," + y + ")"); 
}; 

對於由100,100轉換選擇,例如,我們可以使用:

selection.call(move, 100, 100); 

這裏是一個演示,這個圓圈最初是在10,10之後,並且在1秒之後它被翻譯爲100,100

var circle = d3.select("circle"); 
 
setTimeout(() => { 
 
    circle.call(move, 100, 100) 
 
}, 1000); 
 

 
function move(selection, x, y) { 
 
    selection.attr("transform", "translate(" + x + "," + y + ")"); 
 
};
<script src="https://d3js.org/d3.v4.min.js"></script> 
 
<svg> 
 
    <circle cx="20" cy="20" r="8" fill="teal"></circle> 
 
</svg>

EDIT:使用擴展D3原型的一個非常簡單的和粗例如:

var circle = d3.select("circle"); 
 

 
setTimeout(() => { 
 
    circle.move(100, 100) 
 
}, 1000); 
 

 
d3.selection.prototype.move = function(x, y) { 
 
    this.attr("transform", "translate(" + x + "," + y + ")"); 
 
    return this; 
 
};
<script src="https://d3js.org/d3.v4.min.js"></script> 
 
<svg> 
 
    <circle cx="20" cy="20" r="8" fill="teal"></circle> 
 
</svg>

+0

感謝。這是有道理的。如果我想擴展原型,我應該這樣做:http://stackoverflow.com/questions/32675769/how-can-i-extend-d3?即d3.selection.prototype.move = function(){}? – Jfly

+0

是的。這篇文章給出了更詳細的解釋:http://blogs.atlassian.com/2014/06/extending-d3-js/ –

+0

它似乎下面的作品。 d3.selection.prototype.move = function(x,y){this.attr(「transform」,「translate(」+ x +「,」+ y +「)」); 返回此; }; – Jfly