نمایش یک فهرست، صفحهبهصفحه
هدف
جدولی را بیست ردیف در هر بار نشان دهید، بگذارید در آن جستوجو کنند، و زیرش پیشین و بعدی بگذارید که بدانند کِی باید بایستند.
چرا چنین چیزی هست
فهرست کشیدهشده هرچه بخو اهید بار میکند. همهچیز را بخواهید و جدولی نُهصد ردیفی در یک پاسخ میرسد و بیپایان میلغزد؛ بیست ردیف بخواهید و هیچ چیز روی صفحه نمیتواند بگوید این بیستتا آخرین بیستتاست یا نخستین بیست از نُهصد.
پس پرسوجو دو چیز تازه گرفت: یک صفحه (skip) و جایی برای شمار (countInto).
یک پرسوجو همهٔ اینها را میکند
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(…) از آن روست که اندازهٔ صفحه از یک فهرست بازشو میآید، و هر کنترلی که گزینه پیش میگذارد
واژهها را برمیگرداند نه عدد را — «اندازهٔ صفحه» در پایین را ببینید.
| بخش | یعنی |
|---|---|
top | این صفحه چند ردیف دارد |
skip | چند ردیف را اول رد کند — ردیف، نه صفحه |
where | جفتهای میدان/مقدار که باید دقیق برابر باشند، همه با هم |
contains | جفتهای میدان/زیررشته — آنچه یک جعبهٔ جستوجو میخواهد |
orderBy / descending | ترتیب |
countInto | میدان حالتی برای شمار همهٔ ردیفهای همخوان، بیتوجه به صفحه |
skip ردیف است نه شمارهٔ صفحه، چون top هم ردیف است. صفحهای که هر دو را نگه دارد باید
هماهنگشان کند، و خرابیِ این کار خاموش است: کسی اندازهٔ صفحه را عوض میکند، بازنشاندن صفحه را از یاد
میبرد، و روی صفحهٔ ۷ از فهرستی میایستد که حالا ۳ صفحه دارد.
مقدار خالی در contains هیچ شرطی نمیسازد، پس میتوانید جعبهٔ جستوجو را مستقیم بدهید. جعبهای
که کسی در آن چیزی ننوشته یعنی همهچیز، نه ردیفهایی که رشتهٔ خالی دارند.
countInto رایگان است. پرسوجوی سکو بههرحال میشمارد، پس خواستنِ شمار درخواست دومی ندارد.
صفحهای که دکمهٔ بعدی ندارد آن را نمینویسد و چیزی هم نمیپردازد.
گامها
-
حالتی را که فهرست نیاز دارد اعلام کنید:
cases([])،caseTotal(0)،page(0)،pageSize("20"— مقدار خودِ فهرست بازشو، پس واژه است)،query(""). -
پرسوجوی بالا را در دستگیرهٔ بارگذاری صفحه بگذارید.
-
پیشین و بعدی را بکشید و فعال آنها را ببندید:
- پیشین —
state.page > 0 - بعدی —
(state.page + 1) * num(state.pageSize) < state.caseTotal
- پیشین —
-
دستگیرههایشان صفحه را جابهجا میکنند و پرسوجو را دوباره میدوانند:
setState("page", getState("page") + 1);loadRecords( … همان پرسوجو … ); -
نوشته را بکشید. یک عدد را نمیشود مستقیم به جمله افزود — BS Lang آمیختن رشته و عدد را رد میکند و میگوید Only number or string — پس بپیچیدش:
"Showing " + text(state.cases.length()) + " of " + text(state.caseTotal) -
جعبهٔ جستوجو را جعبهٔ متنی بکشید که به
state.queryبسته است، و دستگیرهٔ تغییر آن را بگذارید که به صفحهٔ صفر برگردد و پرسوجو را دوباره بدواند. جعبهٔ متن وقتی ترکش میکنید یا Enter میزنید تأیید میشود، پس این یک پرسوجو برای هر جستوجوست، نه یکی برای هر حرف.