Ist das möglich? Ich bin mir nicht sicher, da d3 macht stark Gebrauch von this
Rebindings und dies scheint mit ES6 spec zu widersprechen.Verwenden von Pfeilfunktionen mit d3
Zum Beispiel funktioniert die folgende fein:
// Working fine
var data = [1,2,3]
var svg = d3.select('body').append('svg').attr('height', 500).attr('width', 500).style('background-color', 'orange');
var gs = svg.selectAll('g').data(data).enter();
gs.append('circle')
.attr('cx', function() { return Math.random()*500; })
.attr('cy', function() { return Math.random()*500; })
.attr('r', function() { return Math.random()*100; })
.each(function() { console.log(this); }); // this is bound to the current element in the enter selection
Während die folgende funktioniert nicht wie erwartet (this
ist nicht auf das aktuelle Element in der Auswahl eingeben gebunden, sondern an Window
Objekt):
var data = [1,2,3]
var svg = d3.select('body').append('svg').attr('height', 500).attr('width', 500).style('background-color', 'blue');
var gs = svg.selectAll('g').data(data).enter();
gs.append('circle')
.attr('cx',() => Math.random()*500)
.attr('cy',() => Math.random()*500)
.attr('r',() => Math.random()*100)
.each(() => console.log(this)); // this is bound to Window object
Verwandte Geige here.
@chriskelly Ihr Beispiel einfach den gleichen Wert für alle Elemente in der Auswahl legt, was das ist nicht, dass ich erreichen will (Deshalb werden die Funktionen pro Element verwendet. – jarandaf
Wenn ich Ihr Beispiel ausführe, sehe ich nur das Protokoll der Ausgabekonsole. Aber warum willst du auf '' 'this''' zugreifen? Das ist eine interessante Frage, aber ich würde gerne einen Fall wissen, in dem es ein Problem wäre. – chriskelly
@chriskelly es ist ein ziemlich konkreter Anwendungsfall (habe eine Funktion, die ich wiederverwenden möchte, die eine komplexe Struktur von Elementen innerhalb der Svg-Gruppe erzeugt, ich brauche 'this' um zu wissen, auf welche Gruppe ich referenziere, wo neue Elemente angehängt werden). – jarandaf