Eine Option ist die Erweiterung von D3-Prototypen, ich bin mir sicher, dass jemand in Kürze eine Antwort in diese Richtung schreiben wird.
Ich glaube jedoch, dass die einfachste Lösung call verwendet, die:
Ruft die angegebene Funktion genau einmal, zusammen mit allen optionalen Argumenten in dieser Auswahl übergeben.
Also, in Ihrem Fall, lassen Sie uns eine Funktion move
Namen erstellen:
function move(selection, x, y) {
selection.attr("transform", "translate(" + x + "," + y + ")");
};
Für eine Auswahl von 100,100
, zum Beispiel zu übersetzen, können wir verwenden:
selection.call(move, 100, 100);
Hier a Demo, der Kreis ist ursprünglich bei 10,10
, und nach 1 Sekunde ist es übersetzt von 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:
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>
Dank: ein sehr einfaches und grobes Beispiel eines erweiterten D3 Prototyp verwendet wird. Das macht Sinn. Wenn ich den Prototyp erweitern möchte, sollte ich so etwas tun http://stackoverflow.com/questions/32675769/how-can-i-extend-d3? I.e. d3.selection.prototype.move = function() {}? – Jfly
Ja. Dieser Beitrag gibt eine detailliertere Erklärung: http://blogs.atlassian.com/2014/06/extending-d3-js/ –
Es scheint die folgenden funktioniert. d3.selection.prototype.move = Funktion (x, y) { this.attr ("transformieren", "übersetzen (" + x + "," + y + ")"); zurückgeben; }; – Jfly