CHAPTER 23 · PRACTICE WORKSPACE

表單驗證、POST 與資料寫入

完成可驗證、提交並顯示結果的聯絡表單

03 Checkpoint 2 2/3
  1. 01Starter讀懂作品骨架
  2. 02Checkpoint 1加入第一項能力
  3. 03Checkpoint 2累積第二項能力
  4. 04Solution核對完整結果

TASK STATUS

三項任務目前狀態

TASK-01已完成

驗證姓名與 Email

修改檔案:script.js

完成後看見:畫面顯示姓名、Email 驗證結果,通過時仍明確標示尚未建立 payload

TASK-02已完成

建立尚未送出的 payload 預覽

修改檔案:script.js

完成後看見:預覽區顯示 name、email、message,狀態為「payload 已建立;尚未送出」

TASK-03本階段處理

送出並管理 loading/success/error

修改檔案:script.js

完成後看見:成功與失敗都可重現,送出期間按鈕停用且完成後恢復

WORKSPACE

本階段實作區

已完成 TASK-02;先核對可見結果,再前往 TASK-03。

FOCUS TASK · TASK-03

現在只處理:送出並管理 loading/success/error

修改:script.js

完成後:成功與失敗都可重現,送出期間按鈕停用且完成後恢復

講解時展開:2 個小型比較

loading vs disabled|送出期間避免重複操作

比較:loading 說明流程進行中,disabled 防止重複送出;兩者互相補足。

現在做:在 Solution 填入完整資料後送出,立即記錄 status=「送出中…」與 submit.disabled=true;等待成功後確認按鈕恢復。再勾選模擬失敗送出,重複記錄 loading、錯誤訊息、按鈕恢復與輸入保留。

看預期與證據

預期:成功與失敗都會經過 loading;兩條路線最後 submit 都恢復可用,且錯誤不會清空表單。

證據:留下成功與失敗各一條狀態時間線:送出前、loading、結果、finally 後,並記錄 disabled 與三個輸入值。

success vs error|結果要可重現

比較:成功與失敗都是可驗收狀態,不能只處理成功分支或用同一訊息帶過。

現在做:成功路線記錄「送出成功,編號 …」後,再勾選模擬失敗並送出;確認失敗顯示「送出失敗:模擬伺服器錯誤」,最後再次查看按鈕與輸入值。

看預期與證據

預期:success 與 error 是不同且可重現的結果;error 後按鈕仍可再次操作,姓名、Email、訊息仍保留供修正或重試。

證據:提供成功/失敗兩張結果畫面,加上一列 error 後的 disabled、欄位值與再次送出結果,證明不是只處理 success。

需要排錯時查看:任務循環(觀察 → 預測 → 實作 → 故障 → 驗收)
  1. A|觀察:在 Checkpoint 2 確認預覽 JSON 只有 name、email、message,狀態精確為「payload 已建立;尚未送出」,且按鈕從未進入 loading disabled。
  2. B|預測:填入有效資料送出,確認送出中、成功編號與按鈕恢復;勾選「模擬伺服器失敗」再送出,確認錯誤訊息、輸入保留與按鈕恢復。
  3. C|實作:在 script.js 的 mockSubmit()、handleSubmit() 完成「送出並管理 loading/success/error」,一次只處理本任務責任。
  4. D|故障:若結果不一致,先依原操作重現,再檢查 mockSubmit()、handleSubmit() 與 script.js,最後重跑原操作。
  5. E|驗收:成功與失敗都可重現,送出期間按鈕停用且完成後恢復

完成條件:DONE-03:成功與失敗都可重現,送出期間按鈕停用且完成後恢復

MOCK POST

聯絡我

尚未建立 payload

CONTINUE

繼續完成 TASK-03

前往 Solution,依要求完成「送出並管理 loading/success/error」。

前往 Solution:完成 TASK-03

CHAPTER HANDOFF

從列表狀態,交棒到一次可追蹤的送出

接收第 22 章:沿用已完成的產品列表與分頁邊界證據;本章不重做列表,改處理使用者輸入、驗證與提交生命週期。

交給第 24 章:完成後帶著驗證通過的 payload、loading/success/error 與 finally 恢復證據,下一章直接比較一次 POST 與持續訂閱,不重做表單驗證。

前往第 24 章:即時資料模型與 Firebase 介面