Webix JavaScript-Bibliothek mit den Augen eines Anfängers. Teil 5. Arbeiten Sie mit Daten auf der Benutzerseite



Ich bin ein Anfänger-Front-End-Entwickler. Jetzt studiere und trainiere ich in einem Minsker IT-Unternehmen. Das Erlernen der Grundlagen der Web-Benutzeroberfläche erfolgt am Beispiel der Webix JS-Bibliothek. Ich möchte meine bescheidenen Erfahrungen teilen und als kleines Tutorial für diese interessante UI-Bibliothek speichern.

FÜNFTE AUFGABE


In einem früheren Artikel, Arbeiten mit Daten , basierend auf CRUD-Funktionen, habe ich über Standardaufgaben zum Verwalten von Anwendungsdaten geschrieben. In diesem Stadium werde ich versuchen, die Anwendung benutzerfreundlicher zu gestalten und die Möglichkeit zum Filtern, Sortieren und Gruppieren von Daten zu implementieren. In dem Artikel werde ich die folgenden Aufgaben betrachten:


In der Dokumentation finden Sie die Widgets List , Treetable , Table, die im Artikel verwendet werden .

Quellen sind auf dem Link .

Die fertige Bewerbung finden Sie hier .

Filtern und Sortieren von Tabellendaten


Beginnen wir mit den Tabellen - ich habe sie am häufigsten verwendet, um mit vielen Daten zu arbeiten. Tabellen in der Webix-Bibliothek verfügen über eine Reihe integrierter Filter , die direkt in der Kopfzeile der Widgets "Tabelle" und "TreeTable" festgelegt sind. Im Tabellen- Widget verwende ich zwei Optionen: einen einfachen Textfilter ( textFilter ) und einen Filter mit einer Reihe von Optionen in der Dropdown-Liste ( selectFilter ). In der Tabelle können Sie einen Filter für jede Spalte hinzufügen. Ich werde dies für zwei tun: Titel und Jahr. Ich werde den Header in ihnen anstelle eines Strings mit einem Array setzen - passend zum Header und Filter. Das zweite Element des Arrays ist ein Objekt mit einer Content-Eigenschaft und einem Filternamen.
Der Code für das Tabellen-Widget befindet sich in der Datei table.js und wird auf der Registerkarte "Dashboard" gerendert.

Wenn Zeichen in die "textFilter"Daten eingegeben werden, werden sie durch Abgleich nach Teilzeichenfolge gefiltert. Wenn Sie die Option auswählen "selectFilter"- nach dem ausgewählten Wert.

columns:[
    { id:"rank", header:"", width:50, css:"rank"},
    { id:"title", header:["Film title", { content:"textFilter"}], fillspace:true },
    { id:"year",  header:["Released", {content:"selectFilter" }], width:100 },
    { id:"votes", header:"Votes", width:100 },
    { id:"rating", header:"Rating", width:100 },
    { header:"", template:"<span class='webix_icon wxi-close'></span>", width:35}
]

Filterergebnis nach Teilzeichenfolge „Stern“:



Ergebnis der Filterung der Elemente nach dem ausgewählten Wert „1991“:



Sortieren. Wie bei Filtern ist das Sortieren für den Benutzer genauso einfach verfügbar. Dazu reicht es aus, die Spaltenkonfiguration durch die sort- Eigenschaft zu ergänzen . Es gibt verschiedene vorgefertigte Sortiertypen: nach numerischen Werten, nach Datum und nach Zeichenfolge. Für das Jahr, die Stimmen und die Bewertungsspalten werde ich die Einstellung sort: "int" festlegen, um nach numerischen Werten zu sortieren. Für die Titelspalte lautet der Wert "Zeichenfolge".

    columns:[
        { id:"rank", header:"", width:50, css:"rank"},
        { id:"title", header:["Film title", { content:"textFilter"}], fillspace:true, 
         sort:"string"},
        { id:"year",  header:["Released", {content:"selectFilter" }], width:100, sort:"int"},
        { id:"votes", header:"Votes", width:100, sort:"int"},
        { id:"rating", header:"Rating", width:100, sort:"int"},
        { header:"", template:"<span class='webix_icon wxi-close'></span>", width:35}
    ]

Durch Klicken auf die Kopfzeile werden die Daten nach ihrem Typ sortiert. Bewertungssortierungsergebnis:



API-Sortierung und -Filterung


Fertige Lösungen zum Filtern und Sortieren von Elementen enthalten nur Tabellen. Im Allgemeinen unterstützen alle Widgets diese Funktionen über die entsprechenden API-Methoden - Filtern und Sortieren. Ich werde das Filtern und Sortieren mithilfe der API mit dem Listen- Widget demonstrieren .

Der Code für das Listen-Widget befindet sich in der Datei users_module.js und wird auf der Registerkarte "Benutzer" gerendert.

Filtration. Auf der Registerkarte Benutzer installiere ich nach der Schaltfläche "Neue Person hinzufügen" das Text- Widget , das ich als Filter für die Namen aus der Liste verwende.

cols:[
    { 
        view:"button", id:"btn_add_person", 
        value:"Add new person", width:150, css:"webix_primary", 
        click:addPerson
    },
    { 
        view:"text", id:"list_input" 
    },
]

Jetzt öffne ich die Datei script.js und füge die Logik hinzu, die für das Filtern der Elemente verantwortlich ist.

$$("list_input").attachEvent("onTimedKeyPress",function(){
    var value = this.getValue().toLowerCase();
    $$("user_list").filter(function(obj){
        return obj.name.toLowerCase().indexOf(value) !== -1;
    })
});

Elemente werden nach diesem Prinzip gefiltert:
  • Mit der Methode attachEvent füge ich dem Ereignis onTimedKeyPress einen Handler hinzu .
  • Das Ereignis onTimedKeyPress wird durch Eingabe von Zeichen in das Textfeld ausgelöst, jedoch mit einer kurzen Verzögerung, um den Filter nicht bei jedem Tastendruck zu aktivieren.
  • Dann erhalte ich den eingegebenen Text und verwende die Filtermethode , um mit dem Filtern zu beginnen. Suchen Sie im Listen-Widget nach Übereinstimmungen.

Ergebnis über API



filtern : Sortieren. Listen-Widget-Elemente werden durch Klicken auf die Schaltflächen “Sort asc”und sortiert “Sort desc”.

So erstellen Sie Schaltflächen in dem Benutzer Registerkarte , nachdem das Textfeld werde ich zwei hinzufügen Button - Widgets mit einem Klick - Ereignishandler .

cols:[
    { 
        view:"button", id:"btn_add_person", 
        value:"Add new person", width:150, css:"webix_primary", 
        click:addPerson
    },
    { 
        view:"text", id:"list_input" 
    },
    { view:"button", id:"btn_asc", width:150, value:"Sort asc", css:"webix_primary", 
        click:()=>{
            $$("user_list").sort("#name#","asc")
     }},
    { view:"button", id:"btn_desc", width:150, value:"Sort desc", css:"webix_primary", 
        click:()=>{
            $$("user_list").sort("#name#","desc")
    }},
]

Im Innern der Click - Handler, die Sortiermethode akzeptiert für den Parameter: der Name des Feldes , durch welche Art wir die Daten, und die Richtung der Sortierung “asc”(aufsteigend) - aufsteigend, und “desc”(absteigend) - absteigend. Standardmäßig werden Daten als Zeilen betrachtet und entsprechend sortiert.

Ergebnis (Namen im Blatt sind alphabetisch sortiert):



Gruppierung von Baumtabellendaten


Stellen Sie sich eine Situation vor, in der Daten nach beliebigen Parametern gruppiert werden müssen.
Ich werde die Gruppierung am Beispiel des TreeTable-Widgets untersuchen.

Der TreeTable-Widget-Code befindet sich in der Datei products_module.js und wird auf der Registerkarte „Poducts“ gerendert.

In diesem Artikel: Module, Diagramme, Baumtabellen und Arbeiten mit Daten. CRUD , ich habe hierarchische Daten in einer Baumtabelle verwendet. Um dieses Problem zu lösen, habe ich sie geändert, um ein lineares Array zu erhalten. Ich habe die Hierarchie entfernt und das Feld von dort auf jeden Datensatz übertragen “category”.

[
    {"id": "1.1",   "title": "Standard Ticket",  "price": 21, "category":"Cinema", "rank":1.1},
    {"id": "2.1",   "title": "Cola",  "price": 10, "category":"Cafe", "rank":2.1},
    {"id": "3.1",   "title": "Flowers",  "price": 10, "category":"Other", "rank":3.1}
]

Es gibt zwei Möglichkeiten, Daten in einer Tabelle zu gruppieren:


Die Parameter für diese Methoden sind die gleichen und ich muss die Daten einmal gruppieren, sobald sie eintreffen, daher verwende ich die erste Option.
In der Konfiguration der TreeTable widget, füge ich das Schema Eigenschaft . Diese Eigenschaft bestimmt, nach welchem ​​Schema die Daten in verschiedenen Situationen verarbeitet werden. Unter den Handlern in sheme befindet sich die $ group- Methode , mit der ich die Daten gruppieren muss.

const products = {
    editable:true,
    view:"treetable",
    scrollX:false,
    columns:[
        { id:"rank", header:"", width:50 },
        { id:"title", header:"Title", fillspace:true, template:"{common.treetable()} #title#"},
        { id:"price", header:"Price", width:200, editor:"text" }
    ],
    select:"row",
    url:"data/products.js",
    scheme:{
        $group:{
            by:"category",
            map:{
                title:["category"]
            }
        },
        $sort:{ by:"value", dir:"asc" }
    }
}

Innerhalb des $ group-Handlers werden zwei Parameter verwendet:
  • Erforderlicher Parameter nach , nach dem Daten gruppiert werden. Hier ist eines der Felder ("Kategorie");
  • map Objekt - hier haben wir die Datenfelder für die erstellten Gruppen beschreiben. Durch die Gruppierung werden die Quelldaten gemäß den angegebenen Parametern aufgeteilt und für sie "übergeordnete Datensätze" erstellt. Über die Karte können wir diesen Datensätzen neue Felder hinzufügen. Damit die Daten in der Tabelle korrekt angezeigt werden, füge ich das Feld "Titel" hinzu. Ich werde den Wert des Parameters übergeben, nach dem die Gruppierung erfolgt.

Zusätzlich habe ich die $ sort- Funktion eingerichtet , um die gruppierten Daten in alphabetischer Reihenfolge zu sortieren.

Gruppierungsergebnis:



Komponentensynchronisation


Die Aufgabe verwendet Diagramm- und Listen-Widgets, deren Code sich in der Datei users_module.js befindet und auf der Registerkarte "Benutzer" gerendert wird

Diagramm- und Listen-Widgets verwenden dieselben Daten - ein JSON-Array. Diese Komponenten können so verknüpft werden, dass alle Datenänderungen in einer von ihnen (der Quelle) an eine andere übertragen werden. Verwenden Sie dazu die Synchronisierungsmethode.

Mit der Synchronisierungsmethode können Sie Daten von einer Komponente kopieren und auf eine andere übertragen. Gleichzeitig werden Änderungen in der Hauptkomponente wie Hinzufügen, Löschen usw. sofort in einer anderen Komponente wiedergegeben.

Zunächst werde ich im Diagramm- Widget - Diagramm - den Datenlink löschen.

{
    view:"chart",
    id:"chart",
    type:"bar",
    value:"#age#",
    label:"#age#",
    xAxis:{
        template:"#name#",
        title:"Age"
    }
}

Jetzt synchronisiere ich in der Datei script.js mithilfe der Synchronisierungsmethode das Diagramm- Widget mit dem Listen- Widget .

$$("chart").sync($$("user_list"));

In der Funktion addPerson bleibt der Zusatz nur für das Listen-Widget übrig.

let addPerson = () => {
    let obj = {
        name:"Some name",
        age:Math.floor(Math.random() * 80) + 10, 
        country:"Some country"
    }
    $$("user_list").add(obj);
};

Wenn Sie nun Einträge zur Liste hinzufügen und daraus entfernen, werden Änderungen im Diagramm vorgenommen. Das Sortieren und Filtern im Listen-Widget wirkt sich jetzt auf die Daten im Diagramm aus.



Verallgemeinerung


Anhand praktischer Beispiele habe ich gezeigt, wie Sie die Benutzererfahrung verbessern können. Zusätzlich zum standardmäßigen Sortieren und Filtern mithilfe der API wurde die integrierte Funktion in den Widgets "Tabelle" und "TreeTable" mit einer Einstellung beherrscht. Eine Methode zum Gruppieren von Daten in einer Tabelle wurde demonstriert, und das Synchronisationsbeispiel erweiterte die Möglichkeit, den Betrieb von Widgets zu verbessern, die dieselbe Datenquelle verwenden.

Die fertige Bewerbung finden Sie hier .

All Articles