Telerik Kendo UI grid: gruppieren und Sortieren überleben raster.refresh () -, sondern stürzte Gruppen erweitert; how to preserve state
Als typisch für Netze in einem "dashboard" - Anwendung, die überwacht dynamisch ändernden Daten, mein (Telerik) Kendo UI grid aktualisiert wird mit neuen Daten periodisch, alle 60 Sekunden:
grid.dataSource.data(freshData);
grid.refresh(); //have been informed this refresh may not be necessary
Schema nicht ändern, aber ein paar neue Zeilen zeigen, bis in das dataset und etwas entfernt worden sein könnte.
Obwohl die grid.refresh()
lässt sich die Gruppierungen erhalten, und die Art Staat ist auch erhalten geblieben, alle zusammengebrochen Gruppen erweitert werden.
FRAGE: Wie zur Erhaltung (oder Wiederherstellung) der erweiterten/reduzierten Status der Gruppen (also einem Benutzer Schwerpunkt auf eine bestimmte Gruppe erweitert mit den anderen Gruppen zusammengebrochen ist, nicht belästigt/frustriert durch die regelmäßigen Aktualisierungen, in denen jede Gruppe bekommt einen re-standardmäßig erweitert)?
EDIT: Einige Winforms-Netze bieten eine Möglichkeit, "take a snapshot" von der Gruppe erweitern/reduzieren Zustand vor der Aktualisierung der Daten, und klicken Sie dann erneut, den Zustand, nachdem die Datenquelle aktualisieren. Wenn die Gruppe header-Zeilen in der Kendo UI grid hatte UIDs (überlebt, dass ein refresh), es getan werden könnte. Aber siehe den vorgeschlagenen Ansatz unten, die nicht die hartnäckigen Flüssigkeiten.
ANWENDUNGSFALL:
Hier ist ein typischer, wenn auch etwas dramatische Anwendungsfall für dieses feature. Center for Disease Control ist die Echtzeit-überwachung der Ausbrüche eine Besondere Belastung der Grippe, durch die Stadt. Alle 15 Sekunden wird der Datensatz aktualisiert wird. Sie passieren werden, um sich im moment auf Los Angeles und die Stadt erweitert, und die anderen Städte zusammengebrochen. Wenn alle 15 Sekunden das gesamte Netz erweitert, es kotzt aus der ärzte bei der CDC, und Sie gehen in und um die Programmierer und dann gehen Sie nach Hause, zu spielen golf, und jeder in Los Angeles geschlagen geben. Tut Kendo will wirklich verantwortlich sein für diese Katastrophe?
MÖGLICHE FUNKTION VERBESSERUNGS-VORSCHLAG:
Ignorieren Sie meinen Vorschlag über eine UID oben. Hier ist eine bessere Möglichkeit.
Das raster hat
<div class="k-group-indicator" data-field="{groupedByDataFieldName}">
...
</div>
Nun, wenn das k-Gruppe-Indikator div könnte eine Liste der eindeutigen Werte von data-field
mit jedem Schlüssel zugeordneten Daten, die den erweiterten/reduzierten Zustand des entsprechenden Paragrafen, wäre es dann möglich sein, speichern Sie diese Liste in einen Puffer, bevor Sie einen Anruf an die dataSource.Daten( someNewData) - Methode, und klicken Sie dann in der eventhandler-listening für die Datenbindung Ereignis, diejenigen Staaten erweitern könnte erneuert werden. Zu finden ist die entsprechende Gruppierung Abschnitt werden für die Gruppierung der Wert, es wäre sehr hilfreich, wenn die k-grouping-row
könnte haben eine Eigenschaft namens group-data-value
welche die Gruppierung der Wert der besonderen Gruppierung Abschnitt, z.B. "Sales" oder "Marketing", wenn man die Gruppierung von einem Daten-Feld namens Abteilung.
<div class="k-group-indicator" data-field="dept" data-title="Dept" data-dir="asc">
...
<div class="k-group-distinct-values">
<div group-data-value="Sales" aria-expanded="false" />
<div group-data-value="Events Planning" aria-expanded="true" />
</div>
</div>
und dann in die k-grouping-row
: <tr class="k-grouping-row" group-data-value="Sales">
InformationsquelleAutor Tim | 2012-12-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es verständlich, dass dies nicht ein built-in feature. Es ist ziemlich kompliziert, denn wenn man verschachtelte Gruppierungen, Sie hätte sich zu erinnern, jede reduzierte Gruppe in der Hierarchie, dass es existierte. Da sich die Gegenstände bewegen, in die und aus der DataSource, das wäre ein Schmerz zu verfolgen.
Gesagt, hier ist ein sehr hackish Weg, das zu erreichen, was Sie wollen, solange Sie nicht zu kompliziert. Es verwendet einfach die
groupHeaderTemplate
Eigenschaft hinzufügen, um eine UID zu jeder Gruppierung Zeile. Ich bin gerade über die Spalte name + Wert, wie die UID, das ist technisch falsch, wenn man in mehrere Gruppierungen, aber es ist gut genug für ein Beispiel.Von dort aus, bevor Sie aktualisieren, finden Sie die zusammengelegten Gruppen aus dem ARIA-Attribut, Kendo hat nun (nebenbei bemerkt, Sie haben zu verwenden, die 2012 Q3 für diese zu arbeiten). Dann bohren Sie nach unten und Holen Sie sich die UID, die Hinzugefügt wurde, durch die Vorlage.
Nach der Aktualisierung, können Sie die Zeilen mit einem passenden UID und geben Sie Sie in das raster
.collapseGroup()
Funktion zu re-reduzieren.Hier ist eine funktionierende jsFiddle veranschaulicht dies.
Und den code aus dem jsFiddle copy/Paste in (bitte beachten Sie, dass ich nur legen Sie die Vorlage auf die Spalte City, also nur die Stadt, die Spalte wird beibehalten Gruppierung Zusammenbruch in diesem Beispiel!):
HTML:
JavaScript:
Ich persönlich weiß nicht wirklich, wie diese Lösung überhaupt. Es ist viel zu hacky und viel zu viel DOM-traversal. Allerdings ohne re-Implementierung des grid-widgets, ich kann nicht denken, einen besseren Weg, es zu tun. Vielleicht wird es gut genug sein für das, was Sie versuchen zu erreichen, oder geben Sie eine bessere Idee.
Eine Letzte Anmerkung; ich habe die Kendo-UI-source-code und es wird nicht angezeigt, zu verfolgen, welche Gruppierungen sind erweitert/reduziert. Sie tun etwas ähnlich, was ich mit dem aria-Attribut, sondern überprüfen Sie das Klasse, treibt die Symbol-Zustand:
Wenn Sie nicht mit Kendo 2012 Q3 und können nicht das aria-Attribut erweitert, Sie könnte sich ändern, den code zu überprüfen, das Symbol der Klasse statt.
InformationsquelleAutor CodingWithSpike
"Beantwortung" meiner Frage nur um die bessere Lesbarkeit der code-Formatierung im Antwort-editor. Dies ist eine Erweiterung der Diskussion.
Ich bin damit einverstanden, dass verschachtelte Gruppierungen sind komplizierter. Wenn jeder
k-grouping-row
hatte eine Eigenschaft, enthält eine JSON-Repräsentation des Arrays von unterschiedlichen Daten Werte, auf denen die Gruppierung basiert, würde es möglich sein für Entwickler zu extrahieren, die verschiedene Kombinationen von Daten-Werte von jeder reduzierte k-Dispo-Zeile. (Es würde helfen, wenn die k-Dispo-Zeile direkt angezeigt, ob es erweitert oder reduziert, aber, die info erhalten Sie von der Zelle, die er enthält, richtig?)Mit diesen distinct-Werte für ausgeblendete Gruppen in der hand, könnte man konstruieren der eigenen Karte auf den reduzierten Gruppen. Die unterschiedliche Daten-Werte konnten als die Schlüssel für die Objekte in dieser Karte; jede eindeutige Kombination als einzigartig und verbunden mit nur einer Gruppierung-Abschnitt in das raster, egal wie viele Ebenen der Verschachtelung beteiligt sind.
Beispielsweise für eine zwei-Ebenen-Schachtelung
by Department by ProductType
würden wir so etwas wie dieses:Die Abteilung mit dem Wert "Umsatz" und die "ProductType" Wert ist "Spielzeug, Spiele und Videos". Die JSON-Griffe Kommas in den data-Wert.
Für eine drei-Ebenen-Gruppierung von
state, city, zipcode
hätten wir:Diese Daten Werte sind bekannt, wenn die Gruppe erstellt wird, damit Sie verfügbar sind, injiziert werden, in der k-Gruppe-Reihe als einzigartige Griff.
Obwohl die distinct-values sind ein eindeutiges handle, das Sie tun, nicht die Notwendigkeit beseitigen, die zum Durchlaufen des DOM, jeder Besuch und jede
k-grouping-row
wenn man will erneut die eingeklappten Zustand. Doch der Kendo-Netz würde nicht implementieren müssen, um die Wiederherstellung des minimierten Zustand standardmäßig, wenn er der Meinung war, dies sei zu teuer eine operation. Aber man würde Entwicklern eine einfache Möglichkeit, um es zu erreichen, mithilfedata-distinct-values=[...]
, und die Entwickler könnten für sich entscheiden, ob die performance-Einbußen, wenn überhaupt, gerechtfertigt war, die von den Anforderungen der Anwendung.InformationsquelleAutor Tim
Habe ich begonnen, eine robuste Gruppe Stand die Erhaltung der grid-Erweiterung, die entworfen, um die Arbeit mit beiden Kendo-Grid-und ASP.Net RadGrid (control-spezifische Implementierungen nutzen, die gemeinsame Funktionalität).
Diese Erweiterung macht die erheblichen Verbesserungen, Telerik Gruppe state preservation Beispiel und verbessert RadGrid, für die nichts anderes verfügbar auch nur annähernd an die Kendo-UI-Beispiel. Sie können sehen, die Liste der Verbesserungen hier, und Sie können check out den code hier.
Ich würde gerne wissen, was Sie denken.
Danke. Ich bin damit einverstanden, hinzufügen localStorage-state-Funktionalität sollte trivial sein an dieser Stelle. Ich verwende derzeit jStorage für cross-browser-Unterstützung von lokalem Speicher, so werde ich die Haken in die Bibliothek, wenn es geladen ist, bevor sich die Gruppe Staat die Erhaltung Skript. Andernfalls wird das Skript Zugriff auf localStorage direkt.
Super, danke
InformationsquelleAutor Andre Light
Erste von allen, die Sie nur selten benötigen, refresh aufrufen von code. Das Netz (und alle Daten-gebunden, Kendo-widgets) zu hören sind, die für änderungen der Datenquelle und aktualisieren Sie entsprechend.
Durch design-die expand - /collapse-Status der Gruppen ist nicht erhalten. Ändern der Datenquelle wird dazu führen, dass alle Gruppen zu erhalten, erweitert (das ist Ihr default-Zustand).
InformationsquelleAutor Atanas Korchev