2011-08-04 34 views
5

這是一個比技術更多的設計問題,但它讓我完全陷入困境。Jquery XHR導致dom更改持續通過刷新等

所以,我有一個網頁(通過谷歌應用程序引擎託管),列出了一些單獨的形式(每個是一個問題/謎題)。一個謎題有多個文本框可以填寫,還有一個提交按鈕。點擊提交後,服務器(運行python)發出ajax請求,檢查給出的答案是否正確。作爲迴應,通過在相關文本框中添加適當的刻度和十字來更新頁面,以及覆蓋整個問題的中等不透明覆蓋圖(以使整個事件呈現「變灰」效果)。

頁面刷新時,這些修改顯然會消失。但是,ajax請求會將答案信息保存到數據庫中。問題本身是通過使用Jinja2渲染頁面而創建的。

因此,所有的相關數據都會保存下來,以便下一次用戶返回頁面時,他過去回答的問題仍然灰顯,他的答案和剔/十字仍然存在。但是,我無法弄清楚做這件事的最好方法是什麼。我是否使用jinja2循環中的if語句對完成的問題進行硬編碼修改(例如:對於每個正在創建的問題,如果它已經被回答然後以不同的方式呈現)。或者,最好是讓頁面正常加載,然後爲頁面上的每個問題/表單執行加載XHR?

真的,我想要做的是,每個表單都在Jinja2中呈現,執行xhr以查看它是否在db中有答案,並且如果相應採取行動。但是將jinja2與ajax混合看起來相當麻煩,當然還有更好的方法可以解決這個問題嗎?

對不起,長期以來令人費解的問題,希望至少可以理解。

回答

1

我會選擇一個選項#1的變體(使用Jinja2來渲染正確的標記) - 除非你正在渲染大量的表單,頁面應該以非常短的順序返回(如果你有非常大的形式,使大量的XHR請求不會更快)。此外,通過讓Jinja呈現您的HTML,您可以確保沒有JavaScript的用戶至少可以看到他們以前的答案(而不是強迫所有打你的應用的人都啓用了JavaScript)。

你會想要兩件事(如果你不喜歡「T已經有他們):

  1. 代表表單/問題的方式 - 你可能會發現一類最適合你需要的一種封裝的。

  2. 將此類的實例呈現爲HTML的一種方法。這是正好macros是爲那種東西設計的。或者,你可以給你的班級一個__html__方法,(記得返回一個Markup的實例)。

+0

謝謝 - 這無疑給了我一點清晰。做到這一點jinja2絕對是要走的路,你是對的 - 宏觀聽起來不錯。到目前爲止,我只是有一個{%for%}循環將相關變量反覆生成一個表單,這就是爲什麼它試圖修改它時感覺如此笨拙。 – Cerzi