先搜尋與價格篩選
從完整 products 依關鍵字與價格產生 filteredProducts,條件改變時回到第 1 頁。
CHAPTER 22 · 180 MINUTES
資料很多時,不把整座書架倒出來;依頁碼切出一小段,再讓卡片、頁碼與按鈕同步。
LEARNING GOALS
從完整 products 依關鍵字與價格產生 filteredProducts,條件改變時回到第 1 頁。
只對篩選結果切頁,由同一個 render 同步卡片、頁碼與結果數。
0 筆顯示 0 / 0 且雙鍵停用;首末頁不能翻到不存在的頁碼。
可觀察目標:兩種查找操作可單獨或組合使用,條件變更後回第一頁;查找結果每頁最多三筆,卡片與頁碼同步;首末頁按鈕正確停用,空資料不會顯示第 1 / 0 頁。
輸入:第 21 章產物:能用 mock 備援或教師 GAS URL 取得試算表資料
本章輸出:完成可前後翻頁的產品列表
產物類型:mainline;後續用途:第 28 章
PROBLEM & ANALOGY
第 21 章已取得並正規化產品;本章完整陣列仍保留,只依 currentPage 算起點與終點,再用 slice 取得本頁。
本章要解決:頁碼、卡片與按鈕若各自更新,容易不同步或翻到空白頁。
合回共同作品:產品案例會成為作品集中的可操作資料頁。
SCOPE
page、pageSize、slice、totalPages、render 與 disabled。
offset 是從第幾筆開始;能代入數字,不要求背英文。
伺服器分頁、無限滾動、虛擬清單與 URL query 同步。
CORE IDEAS
products 保留完整資料,不因搜尋或翻頁被覆寫。getFilteredProducts() 同時套用關鍵字與價格,條件改變就把 currentPage 重設為 1。totalPages,再用 slice(start, end) 取得目前頁資料。disabled 狀態。先篩選,再分頁。固定一組原始資料,先輸入關鍵字與價格,記錄 filteredProducts 數量;再代入 start/end 取得 pageItems;最後確認 render 顯示相同筆數。空結果必須走到 0 / 0 與雙鍵停用。
DEBUGGING
課堂刻意錯誤:允許 currentPage 超過 totalPages,或只加灰色 class、沒有真的設定 disabled。
先查:印出 currentPage、start、end、totalPages,查頁碼是否越界。
先查:確認事件只改 page,再由同一個 render 更新畫面。
先查:檢查 disabled 屬性與事件條件。
PRACTICE CONTRACT
檔案:script.js
位置:getFilteredProducts()
結果:可以關鍵字、價格或兩者查找產品
檔案:script.js
位置:getPageItems()、render()
結果:查找結果每頁最多三筆,卡片與頁碼同步
檔案:script.js
位置:updateControls()
結果:首末頁按鈕正確停用,無查找結果時顯示 0 / 0 且兩鍵停用
EVIDENCE
目前第 ______ 頁,每頁 ______ 筆,start 是 ______、end 是 ______;totalPages 是 ______。
證據要包含無結果狀態;0 / 0 與兩個停用按鈕也是產品體驗的一部分。
錄下從第一頁翻到最後一頁的操作,畫面須同時看見產品、頁碼與停用按鈕;再口頭代入第二頁的 start、end。
下一章:從讀取產品轉向驗證使用者輸入並安全 POST。