Eine Liste seitenweise anzeigen
Ziel
Eine Tabelle mit zwanzig Zeilen pro Seite anzeigen, sie durchsuchbar machen und darunter Zurück und Weiter setzen, die wissen, wann Schluss ist.
Warum es das gibt
Eine gezeichnete Liste lädt, was Sie von ihr verlangen. Verlangen Sie alles, und eine Tabelle mit neunhundert Zeilen kommt in einer Antwort an und scrollt endlos; verlangen Sie zwanzig, und nichts auf dem Bildschirm kann sagen, ob diese zwanzig die letzten zwanzig sind oder die ersten von neunhundert.
Die Abfrage hat daher zwei Dinge dazubekommen: eine Seite (skip) und einen Ort für die
Anzahl (countInto).
Eine Abfrage erledigt alles
loadRecords("par_case", "cases", {
top: num(getState("pageSize")),
skip: getState("page") * num(getState("pageSize")),
contains: { par_name: getState("query") },
orderBy: "par_name",
countInto: "caseTotal"
});
num(…) steht da, weil die Seitengröße aus einer Dropdownliste kommt, und jedes Steuerelement, das
eine Auswahl anbietet, gibt die Wörter zurück, nicht die Zahl – siehe Die Seitengröße unten.
| Teil | Bedeutung |
|---|---|
top | wie viele Zeilen diese Seite enthält |
skip | wie viele zuerst übersprungen werden – Zeilen, keine Seiten |
where | Feld/Wert-Paare, die exakt übereinstimmen müssen, alle |
contains | Feld/Teilzeichenfolge-Paare – was ein Suchfeld braucht |
orderBy / descending | die Reihenfolge |
countInto | ein Zustandsfeld für wie viele Zeilen insgesamt übereinstimmen, unabhängig von der Seite |
skip zählt Zeilen statt einer Seitennummer, weil top bereits Zeilen zählt. Ein Bildschirm, der
beides hält, müsste beides konsistent halten, und das geht still schief: Jemand ändert die Seitengröße,
vergisst, die Seite zurückzusetzen, und landet auf Seite 7 einer Liste, die jetzt 3 hat.
Ein leerer contains-Wert trägt nichts bei, Sie können Ihr Suchfeld also direkt durchreichen. Ein
Feld, in das niemand etwas getippt hat, bedeutet alles, nicht Zeilen, die die leere Zeichenfolge
enthalten.
countInto ist kostenlos. Die Abfrage der Plattform zählt ohnehin, die Gesamtzahl zu verlangen
kostet also keine zweite Anfrage. Ein Bildschirm ohne Schaltfläche Weiter lässt es weg und zahlt nichts.
Schritte
-
Deklarieren Sie den Zustand, den die Liste braucht:
cases([]),caseTotal(0),page(0),pageSize("20"– der eigene Wert der Dropdownliste, also Wörter),query(""). -
Legen Sie die obige Abfrage in den Handler Geladen des Bildschirms.
-
Zeichnen Sie Zurück und Weiter, und binden Sie ihr Aktiviert:
- Zurück –
state.page > 0 - Weiter –
(state.page + 1) * num(state.pageSize) < state.caseTotal
- Zurück –
-
Ihre Handler verschieben die Seite und führen die Abfrage erneut aus:
setState("page", getState("page") + 1);loadRecords( … the same query … ); -
Zeichnen Sie die Beschriftung. Eine Zahl lässt sich nicht direkt an einen Satz anhängen – BS Lang weigert sich, eine Zeichenfolge und eine Zahl zu mischen, und meldet Only number or string –, also umschließen Sie sie:
"Showing " + text(state.cases.length()) + " of " + text(state.caseTotal) -
Zeichnen Sie das Suchfeld als Textfeld, gebunden an
state.query, und geben Sie ihm einen Änderungs-Handler, der zu Seite null zurückkehrt und die Abfrage erneut ausführt. Ein Textfeld übernimmt seinen Wert, wenn es verlassen oder die Eingabetaste gedrückt wird – das ist also eine Abfrage pro Suche statt einer pro Buchstabe.
Die Seitengröße
Eine Dropdownliste am rechten Ende der Zeile, mit 10, 20, 30, 40, 50, 100 und 200:
- Zeichnen Sie einen Kasten, machen Sie ihn zu einem Steuerelement Dropdownliste, und tippen Sie die Größen in seine Optionsliste.
- Binden Sie seinen Wert an
state.pageSize– ein einfacher Zustandspfad, sodass das Gewählte zurückgeschrieben wird, bevor irgendetwas anderes läuft. - Geben Sie ihm einen Änderungs-Handler, der die Seite auf null zurücksetzt und die Abfrage erneut ausführt.
- Schreiben Sie die Worte Seitengröße in den Kasten statt daneben. Was Sie in ein Steuerelement zeichnen, wird zu seinem Platzhalter und zu dem Namen, den ein Screenreader ankündigt; eine Beschriftung davor wiederholt, was die ungeöffnete Dropdownliste bereits sagt.
Sie gibt die Wörter zurück, nicht die Zahl. Das tut jedes Steuerelement, das eine Auswahl
anbietet – state.pageSize enthält also "20", und für Arithmetik brauchen Sie num(…):
num(state.pageSize) * state.page
Ohne das weist BS Lang das Paar zurück und meldet Only number or string – dieselbe Regel, wegen der
eine Beschriftung text(…) braucht; beides sind entgegengesetzte Richtungen derselben Umwandlung.
num(…) liefert 0 für alles, was keine Zahl ist, eine unberührte Auswahl kann den Bildschirm also
nicht kaputtmachen.
Kehren Sie immer zu Seite null zurück, wenn sich die Form der Liste ändert – eine neue Seitengröße, eine neue Suche. Eine gefilterte Liste, die auf Seite sieben geblieben ist, zeigt nichts und wirkt wie eine kaputte Suche.
Eine Auswahl durchsuchen
Dasselbe contains macht ein Nachschlagefeld erst brauchbar. Im Beispiel Support desk hat die
Karte der Kontaktauswahl ein eigenes Textfeld, dessen Änderungs-Handler erneut ausführt:
loadRecords("contact", "contacts", { top: 8, orderBy: "fullname",
contains: { fullname: getState("contactQuery") } });
Das ist die Antwort der Umgebung, kein Filter über die acht Zeilen, die bereits in der Karte stehen – und genau das ist der Unterschied zwischen einer Auswahl und einer Auswahl, die nur finden kann, was sie bereits abgerufen hat.
Was es hier nicht gibt
Es gibt kein oder. contains nimmt mehrere Felder und verknüpft sie mit UND, und das ist nicht
das, was ein Suchfeld über drei Spalten bedeutet. Wenn in einem von mehreren Feldern gesucht werden
soll, hört ein Filter auf, eine Zeile in einem Handler zu sein, und wird zum Abfrage-Designer, den die
Plattform bereits hat.
Fehlerbehebung
- Die Beschriftung zeigt
Only number or string. – Eine Zahl wird an einen Satz angehängt. Umschließen Sie sie mittext(…). Dieselbe Meldung bei einer Summe ist das umgekehrte Problem: Die Wörter eines Steuerelements werden als Zahl verwendet, umschließen Sie sie also mitnum(…). - Die Seitengröße bewirkt nichts, oder die Liste wird bei einer Änderung leer. –
state.pageSizeenthält die Wörter der Dropdownliste.topundskipbrauchennum(…)darum herum. - Weiter wird nie deaktiviert. – Nichts schreibt die Gesamtzahl. Fügen Sie der Abfrage
countIntohinzu. - Die Suche findet nach der ersten Seite nichts. – Der Such-Handler setzt
pagenicht zurück. - Die Liste fragt bei jedem Tastendruck neu ab. – Der Handler hängt an etwas, das pro Zeichen auslöst. Legen Sie ihn auf die Änderung des Felds, die beim Verlassen auslöst.