Webix JavaScript-Bibliothek mit den Augen eines Anfängers. Teil 4. Mit Daten arbeiten. CRUD



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 sie als kleines Tutorial für diese interessante UI-Bibliothek speichern.

VIERTE HERAUSFORDERUNG


Bei der Arbeit mit Daten ist es wichtig, verschiedene Arten von Vorgängen ausführen zu können. In der Webentwicklung ist CRUD dafür verantwortlich - vier Grundfunktionen. Die Webix-Bibliothek verfügt über alle Tools zur Implementierung von CRUD. Die Grundlage für die Lösung neuer Probleme wird mir als Material aus früheren Veröffentlichungen dienen: Erstellen einer Anwendungsschnittstelle , Projektmodule und Arbeiten mit Formularen .Dieser Artikel behandelt die folgenden Aufgaben:

  • Bearbeiten von Tabellendaten über ein Formular;
  • Installation des eingebauten Zeileneditors ;
  • Hinzufügen von Daten zur Liste und zum Diagramm;
  • Elemente löschen;

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

Quellen sind auf dem Link .

Die resultierende Demo-Anwendung finden Sie hier .

Schritt 1. Bearbeiten von Daten über das Formular


In diesem Schritt arbeite ich mit der Registerkarte "Dashboard", in der die Tabelle und das Formular gezeichnet werden. Der Tabellencode befindet sich in der Datei table.js, der Formularcode in form.js.

Im Artikel „ Arbeiten mit Formularen “ wurden neue Einträge mit der Methode add () hinzugefügt , die durch die Formularvalidierung ergänzt wurde. Jetzt wird das Formular zum Bearbeiten von Einträgen verwendet.

Widgets Tabelle Ich füge Ereignis onAfterSelect hinzu .
Wenn dieses Ereignis ausgelöst wird, erhalte ich Daten aus der Tabelle und übertrage sie in die Formularfelder.

const table = {
    view:"datatable", 
    id:"film_list",
    scroll:"y",
    select:true,
    url:"data/data.js",
    hover:"myhover",
    columns:[
        { id:"rank", header:"", width:50, css:"rank"},
        { id:"title", header:"Film title", fillspace:true},
        { id:"year",  header:"Released", width:100},
        { id:"votes", header:"Votes", width:100},
        { id:"rating", header:"Rating", width:100}
    ],
    on:{
        onAfterSelect(id){
            let values = $$("film_list").getItem(id);
            $$("film_form").setValues(values)
        }
    }
}

Die Methode setValues ​​() im obigen Code ist für die Übergabe der empfangenen Werte an das Formular verantwortlich.

Ich führe den Code aus und überprüfe das Ergebnis:



Sobald eine Zeile in der Tabelle ausgewählt ist, werden ihre Daten automatisch in das Formular übernommen und sind bereit zu arbeiten.

Jetzt verkompliziere ich den Vorgang: Der neue Datensatz wird wie zuvor zur Tabelle hinzugefügt. Wenn die Daten aus der Tabelle entnommen und bearbeitet werden, speichere ich diese Änderungen.

Ich werde die Funktion saveItem neu schreiben und neue Methoden hinzufügen:

let saveItem = () => {
    let form = $$( "film_form" );  
    let list = $$( "film_list" );  
    let item_data = $$("film_form").getValues();    
    if( form.isDirty() && form.validate() ){
        if( item_data.id ) 
            list.updateItem(item_data.id, item_data);
        else 
            list.add( item_data );
    }
}

Die Funktion hat jetzt den folgenden Algorithmus:
  • Zu Beginn wird eine Prüfung für zwei Bedingungen gestartet - ob die Formulardaten die Validierung bestanden haben und ob sich das Formular geändert hat. Änderungen im Formular werden mit der Methode isDirty () überwacht .
  • Danach können Sie mit der Bedingung "item_data.id" einen neuen Datensatz definieren. Eine Zeichenfolge wird mit allen Daten, einschließlich der ID, an das Formular gesendet, für die das Formular kein Textfeld enthält, das jedoch für Daten erforderlich ist. Das Formular speichert und ermöglicht das Lesen aller übermittelten Werte. Daher verwenden wir zur Überprüfung die ID.
  • Nach dem Abgleichen von Datensätzen wird entweder ein neuer Datensatz hinzugefügt - mit der Methode add () , oder das aktuelle Element wird mit neuen Eigenschaften aktualisiert.


Zum Aktualisieren der bearbeiteten Daten wird die Methode updateItem () verwendet . Die Methode verwendet zwei Parameter: die ID des ausgewählten Elements und eine Reihe neuer Eigenschaften aus dem Formular. Beim Aufruf der Funktion werden die aktuellen Daten ersetzt und durch neue ergänzt.

Ergebnis:



Schritt 2. Installieren Sie den integrierten Editor


Im vorherigen Schritt habe ich die Option zum Bearbeiten von Tabellendaten mithilfe eines Formulars in Betracht gezogen. Das Formular auf der Seite wird jedoch nicht immer benötigt, daher implementiere ich die Bearbeitungsmethode direkt im Element. Diese Methode ist sowohl in der Tabelle als auch in anderen Komponenten für die Arbeit mit großen Datenmengen anwendbar - beispielsweise in einer Liste.

Ich beginne mit einer Baumansicht auf der Registerkarte " Produkte ". Der Code für die Tabelle befindet sich in der Datei products_module.js.

Mit dem Treetable- Widget können Sie den Inhalt von Tabellen bearbeiten, diese Funktion ist jedoch standardmäßig deaktiviert. Die Bearbeitung wird an zwei Stellen konfiguriert: in der Tabellenkonfiguration editable:true, in der Konfiguration und in der Konfiguration jeder Spalte. Die Lautsprecher sind eingerichtet editor:”text”. Das Attribut "Text" legt den Typ des Editors fest. Weitere Informationen zu Editor-Typen finden Sie unterDokumentation .

const products = {
    editable:true,
    view:"treetable",
    scrollX:false,
    columns:[
        { id:"id", header:"", width:50 },
        { id:"title", header:"Title", fillspace:true, 
        template:"{common.treetable()} #title#", editor:"text" },
        { id:"price", header:"Price", width:200, editor:"text" }
    ],
    select:"row",
    url:"data/products.js",
    rules:{
        "price":webix.rules.isNotEmpty,
        "title":webix.rules.isNotEmpty
    }
}

Im Code habe ich Editoren für die Spalten Titel und Preis hinzugefügt. Durch Klicken auf eine beliebige Zelle wird ein Editor geöffnet - ein Textfeld:



Jetzt gehe ich zur Registerkarte " Benutzer " und analysiere die Option zum Bearbeiten des Listen- Widgets . Der Widget-Code befindet sich in der Datei users_module.js.

Die Datenbearbeitung ist standardmäßig für TreeTable- und DataTable-Widgets verfügbar. Um den integrierten Editor in anderen Widgets zu verwenden, können Sie das spezielle EditAbility- Modul verwenden . Ich benutze dieses Modul, um die Daten des Listen-Widgets zu bearbeiten. Dazu erstelle ich basierend auf dem LIst-Widget eine benutzerdefinierte Komponente mit der protoUI- Methode .

Ich schreibe den Namen - die Namenseigenschaft - des zukünftigen Widgets auf und erbe die notwendigen Module für das Basis-Widget.

Listen-Widget-Prototyp:

webix.protoUI({
    name:"editlist"
}, webix.EditAbility, webix.ui.list);

Nach dem Aufruf von protoUI erhalte ich die fertige Komponente. Es wird auf die gleiche Weise wie alle anderen in das Widget eingebettet - durch Festlegen view:"editlist".

view: "editlist",
editable:true,
editor:"text",
editValue:"name",
id:"user_list",
select:true,
url:"data/users.js",
template:"#name# from #country# <span class='webix_icon wxi-close'></span> "
}

Da jeder Datensatz viele Felder enthalten kann und Name und Land sofort im Vorlagenblatt gezeichnet werden, wird in der Konfiguration die Einstellung - hinzugefügt editorValue:”name”, die angibt, welches Feld bearbeitet werden kann.

Ergebnis:



Schritt 3. Hinzufügen von Daten zur Liste und zum Diagramm


In diesem Teil des Artikels werden Widgets für Liste und Diagramm verwendet. Der Code befindet sich in der Datei users_module.js und wird auf der Registerkarte " Benutzer " gerendert .

Diagramm- und Listen-Widgets verwenden dieselben Daten - ein JSON-Array. Wenn ich die Möglichkeit zum Hinzufügen von Daten implementiere, ist es daher erforderlich, dass sie in beide Komponenten fallen.

Dazu zeichne ich im Benutzermodul die Schaltfläche "Neue Person hinzufügen".

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

Durch Klicken auf die Schaltfläche wird die Funktion addPerson aufgerufen , die der Liste einen neuen Datensatz hinzufügt.

Das Diagramm zeigt das Alter jedes Datensatzes an, sodass für einen größeren Spread eine Zufallszahl generiert wird.

Funktion zum Hinzufügen eines neuen Datensatzes:

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

Ergebnis:



Schritt 4. Elemente löschen


Das Entfernen von Elementen wird anhand des Listen-Widgets als Registerkarte "Benutzer" und des Tabellen-Widgets als Registerkarte " Dashboard" demonstriert .

Zunächst erstelle ich im Tabellen-Widget eine neue Spalte, in die ich das HTML-Tag mit dem Symbol einfügen werde.

Um Klicks auf Symbole zu verfolgen, müssen Sie die Eigenschaft onClick table verwenden . Dies ist ein Objekt, das Handler, die Elementen zugeordnet sind, gemäß einer ihrer CSS-Klassen speichert - ich habe es "delete_icon".

Um Klicks auf Symbole zu verarbeiten, nehme ich deren Klasse delete_icon und schreibe sie als Schlüssel in das onClick-Objekt. Der Wert dieses Schlüssels ist eine Funktion - unser Handler. Zu den Argumenten gehört die ID des Datensatzes, sodass nichts daran hindert, ihn mit der Methode remove () zu entfernen .

Tabellen-Widget-Code:

const table = {
    view:"datatable", 
    id:"film_list",
    scroll:"y",
    select:true,
    url:"data/data.js",
    hover:"myhover",
    columns:[
        { id:"rank", header:"", width:50, css:"rank"},
        { id:"title", header:"Film title", fillspace:true},
        { id:"year",  header:"Released", width:100},
        { id:"votes", header:"Votes", width:100},
        { id:"rating", header:"Rating", width:100},
        { header:"", template:"<span class='webix_icon wxi-close delete_icon'></span>", 
        width:35}
    ],
    onClick:{
        delete_icon(e, id){
        this.remove(id);
        return false;
        }
    },
    on:{
        onAfterSelect(id){
            let values = $$("film_list").getItem(id);
            $$("film_form").setValues(values)
        }
    }
}

Der Algorithmus zum Löschen von Zeilen für das Listen-Widget ist der gleiche wie für das Tabellen-Widget:

{
    view: "editlist",
    editable:true,
    editor:"text",
    editValue:"name",
    id:"user_list",
    select:true,
    url:"data/users.js",
    template:`#name# from #country# 
    <span class='webix_icon wxi-close delete_icon'></span> `,
    onClick:{
        delete_icon(e, id){
            this.remove(id);
            return false;
        }
    }
},

Das Ergebnis des Löschens von Zeilen auf der Registerkarte Benutzer:



Die fertige Anwendung finden Sie hier .

Fazit


Die Implementierung von CRUD mithilfe der jix-Bibliothek von Webix erfolgt auf verschiedene Weise: Es gibt integrierte Editoren zum Ändern von Daten und eine API , mit der Sie dasselbe tun können, jedoch über ein Formular eines Drittanbieters. Das Hinzufügen von Daten hat verschiedene Szenarien, und in der Form können Sie den gesamten Satz von CRUD-Funktionen implementieren. Methoden werden mit wenigen Codezeilen implementiert. Die Bibliotheksarchitektur macht es einfach, verschiedene Funktionen miteinander zu kombinieren.

Source: https://habr.com/ru/post/undefined/


All Articles