2014-05-06 7 views
7

Ich verwende dc.js, um ein schönes Blasendiagramm eines Datasets zu rendern. Basiswert dc.js ist crossfilter.Ersetzen Sie Crossfilter-Daten, Wiederherstellen von Dimensionen und Gruppen

Ich möchte mein Diagramm mit neuen Daten vom Server reibungslos aktualisieren. This issue on Github macht deutlich, dass es möglich ist, diese durch zu tun:

  1. alle Daten aus dem crossfilter Löschen
  2. in den neuen Daten hinzugefügt
  3. Aufruf dc.redrawAll().

Ich habe diese Arbeit bekam aber, um alle Daten zu löschen, müssen Sie zunächst alle Filter entfernen haben (weil crossfilter.remove nur die Datensätze entfernt den aktuellen Filter entsprechen).

Ich möchte mich daran erinnern, wie meine Daten zuvor gefiltert wurden, so dass ich den Filter wieder rekonstruieren kann, sobald ich alle Daten ersetzt habe. Ich bin bereit, in die Eingeweide des Codes zu kommen, aber alle Hinweise wären hilfreich.

Zusätzlich: Wenn jemand einen Weg der Aktualisierung von Crossfilter-Daten auf Basis eines eindeutigen Schlüssels kennt, wäre das Goldstaub!

+1

Fügen Sie nur Daten hinzu? Dann würde ich sagen crossfilter.add ([Daten]) verwenden. Wenn Sie auch Daten entfernen müssen, habe ich nicht viel zu bieten, aber Sie sollten sich vielleicht dieses Problem ansehen und kommentieren, wenn es nach der richtigen Richtung klingt: https://github.com/square/crossfilter/issues/109 –

+0

@EthanJewitt Ich füge * oder * keine Daten hinzu. Ich aktualisiere vorhandene Daten, jede Zeile eindeutig verschlüsselt. Oder hat "hinzufügen" die Möglichkeit, basierend auf einem Schlüssel zu aktualisieren? – LondonRob

+0

Gotcha - dann müssen Sie die alten Daten entfernen und neue Daten hinzufügen (keine Möglichkeit, vorhandene Schlüssel zu aktualisieren, soweit ich weiß). Diese Fähigkeit existiert im Moment nicht wirklich, da Sie alle Filter entfernen müssen, um Ihre Daten zu entfernen. Ich persönlich denke, das ist etwas, das in Crossfilter angesprochen werden muss, und es gibt einige Diskussionen darüber, wie man damit umgehen kann, aber ich glaube nicht, dass irgendjemand Zeit hatte, damit umzugehen. –

Antwort

1

Dank @ londonrob Antwort- alle Daten jetzt aus dem Index entfernt wird. Hier ist ein funktioneller Ansatz für das Zurücksetzen von Daten.

// reset the filter for a dimension 
function resetDimensionFilter (dimension) { 
    dimension.filter(null); 
} 

// reset filters for all given dimensions, 
// remove all data from index and 
// return empty index 
function resetData(ndx, dimensions) { 
    // Clear all filters from dimensions, because `ndx.remove` 
    // only removes records matching the current filters. 
    dimensions.forEach(resetDimensionFilter); 

    // Remove all data from the cross filter 
    ndx.remove(); 
} 
+0

Wow! Das sind gute Nachrichten. Kannst du dich mit dem Github-Fix/Issue/PR verbinden, der das angeht? – LondonRob

+0

Nicht sicher, was du meinst. Ich habe Ihren Code nur ein wenig umgeschrieben, um nur das Zurücksetzen zu tun. –

+0

Oh. Also, was ist dank londonrob's Antwort alle Daten sind jetzt aus dem Index entfernt 'beziehen sich auf? Ich bin verwirrt ... – LondonRob

3

Hier ist, was ich zusammen Hacking endete. Es funktioniert sehr gut, obwohl ich sicher bin, ist es lächerlich ineffizient, da alle Dimensionen von Grund auf neu erstellt werden müssen:

var _xfilter = crossfilter({x:1, y:2},{x:3, y:4}), 
    _dimensions = []; 

_dimensions.push(_xfilter.dimension(function(d) { return d.x; }); 

// Unfilters all the given dimensions, removes all data 
// from xf and adds newData to xf. 
var _xfilter_reset = function(xf, dimensions, newData) { 
    var i; 
    for (i = 0; i < dimensions.length; i++) { 
     // Clear all filters from this dimension. 
     // Necessary because xf.remove only removes records 
     // matching the current filter. 
     dimensions[i].filter(null); 
    } 
    xf.remove(); // Remove all data from the crossfilter 
    xf.add(newData); 
    return xf; 
} 

// Resets the global crossfilter object and reapplies all 
// current dc.js chart filters. 
var _refresh_data = function(data) { 
    var i, j, 
     chart, oldFilters, 
     allCharts = dc.chartRegistry.list(); 

    _xfilter = _xfilter_reset(_xfilter, _dimensions, data);  

    // Reset all filters using dc.js 
    for (i = 0; i < allCharts.length; i++) { 
     chart = allCharts[i]; 
     oldFilters = chart.filters(); // Get current filters 
     chart.filter(null); // Reset all filters on current chart 
     for (j = 0; j < oldFilters.length; j++) { 
      // Set all the oldFilters back onto the chart 
      chart.filter(oldFilters[j]); 
     } 
    } 
    dc.redrawAll(); 
} 
+1

Ich denke, dass dies mit dem, was wir jetzt haben, optimal sein kann - alle Gruppen und Reduktionen müssen sowieso neu berechnet werden. Sie könnten versuchen, die Filter neu aufzubauen, während keine Daten vorhanden sind, so dass crossfilter keine Indizes und Reduzierungen für jeden '.filter'-Aufruf mischt. Oder wir können auf das Feature @Ethan oben hoffen. – Gordon

Verwandte Themen