2016-06-17 9 views
1

Ich bin ein d3.js noob, ich habe gerade angefangen für eine schnelle Übung zu lernen. Ich angehängt verschiedene Texte mit verschiedenen Mustern, so dass ich verschiedene Funktionen mit der selectAll("text") Anweisung verwenden.Doppelte Werte und überlappende selectAll in D3

Aber es gab ein Problem mit diesem. Wenn ich 3 Etiketten anfüge und dann versuche, 4 weitere hinzuzufügen, wird nur die 4. angewendet. Das liegt daran, dass die selectAll diejenigen durchlaufen würde, die bereits eingefügt wurden. Beim googeln dieses Problems erfuhr ich, dass die Lösung darin bestand, .data(data, function(d){ return d; }) zu verwenden und die neuen Elemente korrekt hinzugefügt worden wären. Bis jetzt wurden alle meine Probleme gelöst.

Das Problem entsteht jetzt, dass ich die Werte "40" und "60" zweimal in zwei verschiedenen Kontexten anhängen muss, aber die doppelten Werte werden ignoriert. Wieder googelte ich für eine Lösung und kam zu diesem Post - Complex data object with duplicate 'values' = missing chart bars Es heißt, die Lösung ist, die gleiche Zeile zu entfernen, die ich bereits erwähnte oder einen anderen Wert verwenden, aber in meinem Fall habe ich es mit einem einfachen Array von Zahlen zu tun. Das Entfernen der Zeile, die vorherige Elemente enthält, hilft nicht, da die nächsten Elemente nicht angehängt werden.

EDIT: Es gibt eine Github Frage, die dieses Clarify behavior for selection.data in re. to duplicate keys. #997 bespricht - Ich fand es in keiner Weise klärend. Vielleicht werden Sie sich besser einen Sinn geben, als ich es tat ...

EDIT 2: Hier ist ein jsFiddle explaining the issue

+0

Hallo. Haben Sie etwas, um es zu testen? – Klaujesi

+0

@Klaujesi die Geige in der Post, die ich verlinkt (http://jsfiddle.net/Alexbbrown/KM9dj/) zeigt, wie die Duplikate nicht angezeigt werden. Diese gegabelte Version zeigt dasselbe mit bereits vorhandenen Elementen. http://jsfiddle.net/46v6e575/ – Thaenor

+0

Entfernen Sie die Funktion I auf Daten .Data ([3,2,3], I)> .Data ([3,2,3]) – Klaujesi

Antwort

1

Aufgrund dieser ist eine gut dokumentierte Fehler ohne zu beheben, können Sie Ihre Daten optimieren, das Hinzufügen eines Index falsche Auswahl auf Nachschlüssel verhindern:

[{index:1, value:3}, 
{index:2, value:2}, 
{index:3, value:3}] 

und Referenzierung als: d.index und d.value:

d3.select(".I997").selectAll("p") 
      .data([{index:1, value:3},{index:2, value:2},{index:3, value:3}]) 
     .enter() 
     .append("p") 
     .text(function (d) {return d.value}) 

d3.selectAll("p") 
     .data([{index:4, value:3}]) 
     .append ("p") 
     .text(function (d) {return d.value}) 

oder Sie können diese verwenden:

var ps = d3.select("body").selectAll('div') 
    .data([3, 2, 3]) 
    .enter() 
    .append('div') 
    .text(String); 

d3.selectAll('div') 
    .data([3]) 
    .append('div') 
    .text(String); 

das funktioniert, wie Sie

Hier Arbeits Code erwarten: https://jsfiddle.net/5rxadq4q/

https://jsfiddle.net/v0n8971q/1/

+0

Ich habe die Geige neu erstellt, weil ich vergessen habe, eine Sache zu erwähnen. In meinem aktuellen Projekt hänge ich Elemente an eine Leinwand an, nicht an HTML-Tags. Als es zum eigentlichen Bit des Buggy-Codes kam, waren bereits Textelemente eingefügt, die von selectAll eingeschlossen wurden. Ich habe diese Änderungen in der Geige gemacht und es scheint in Ordnung, solange ich Daten manipuliere, wie Sie gesagt haben. https://jsfiddle.net/thaenor/xcz0mpoo/2/ – Thaenor

+0

Eigentlich muss ich meinen letzten Kommentar bearbeiten. Ich habe immer noch einige Probleme. In meiner App lege ich Textlabels mit verschiedenen Dingen an. Einige haben einfach Text und andere sind Zahlen aus verschiedenen Quellen. Weil es all diese verschiedenen "Textzuordnungen" gibt, die '' 'canvas.selectAll (" text ") verwenden. Data (nArray, function (d) {return d.index;})' '' funktioniert nicht, weil der erste Text Elemente in der Zeichenfläche haben keine Eigenschaft '' '.index''' – Thaenor