Ich kann nicht verstehen, wie d3.call () funktioniert und wann und wo ich das verwenden soll. Hier ist der Tutorial-Link, den ich zu vervollständigen versuche.
Kann jemand bitte genau erklären, was dieses Stück tut
var xAxis = d3.svg.axis()
.scale(xScale)
.orient("bottom");
svg.append("g").call(xAxis);
javascript
d3.js
Andy897
quelle
quelle
call()
Antworten:
Ich denke, der Trick hier ist zu verstehen, dass xAxis eine Funktion ist, die eine Reihe von SVG-Elementen generiert. Tatsächlich ist es die von zurückgegebene Funktion
d3.svg.axis()
. Die Skalierungs- und Orientierungsfunktionen sind nur ein Teil der Verkettungssyntax (mehr dazu hier: http://alignedleft.com/tutorials/d3/chaining-methods/ ).So
svg.append("g")
hängt ein SVG - Gruppen - Element an die SVG und gibt einen Verweis auf mich selbst in Form einer Auswahl (gleiche Ketten Syntax bei der Arbeit hier). Wenn Siecall
eine Auswahl verwenden, rufen Sie die FunktionxAxis
auf, die für die Elemente der Auswahl benannt istg
. In diesem Fall führen Sie die AchsenfunktionxAxis
für die neu erstellte und angehängte Gruppe ausg
.Wenn dies immer noch keinen Sinn ergibt, entspricht die obige Syntax:
xAxis(svg.append("g"));
oder:
d3.svg.axis() .scale(xScale) .orient("bottom")(svg.append("g"));
quelle
.call()
Methode im Allgemeinen gut. Insbesondere werden die Konsequenzen des Aufrufs des Achsenobjekts nicht erläutert. Und es ist nicht annähernd gerechtfertigt, die surreale Situation eines Achsenobjekts zu rechtfertigen, das sich sowohl wie ein Objekt als auch wie eine Funktion verhält . Warum in aller Welt das tun? Okay, die Dokumente sagen, dass das Aufrufen die Achse rendert . Ist das besser, als dem Achsenobjekt eine .render () -Methode zu geben? Würde das nicht viel einfacher unterstützenxAxis.scale(...).orient(...).render(...)
Die akzeptierte Antwort, die IMO ausgelassen hat, ist, dass
.call()
es sich um eine D3-API-Funktion handelt und nicht mit Function.prototype.call () zu verwechseln ist.selection.call(function[, arguments…])
Sagen Sie jetzt:
d3.selectAll("div").call(name, "John", "Snow");
Dies entspricht in etwa:
name(d3.selectAll("div"), "John", "Snow");
Der einzige Unterschied besteht darin, dass selection.call immer die Auswahl und nicht den Rückgabewert der aufgerufenen Funktion name zurückgibt .
quelle