這是我最終實現的設計。我還沒有一個完整的解決方案,但我認爲這是一個好的開始。
數據模型
在我的情況下,用戶需要能夠建立,任務可以有不同的類型,因此屬性的任務列表。任務也可以嵌入其他對象。儘管我正在處理更深層次的嵌套對象,但與某種意義上的表單構建器類似。這裏的關鍵是確保您的後端應用程序僅公開與您的應用程序域相關的對象(在Domain Driven Design的意義上),以便您的客戶端代碼在從服務器調用中反序列化數據後不重複數據並在序列化之前準備保存。就此而言,我必須對服務器端表示層進行一些更改,但結果我認爲我的客戶端代碼更清晰,更專注於處理實際的用戶事件。
數據序列
我選擇JSON作爲數據交換格式。在客戶端,我有兩個處理數據序列化和反序列化的函數。該實現非常簡單(部分歸功於我公開的域模型對象的一些更改)。我在下面粘貼了一個簡化版本。唯一的挑戰是Rails用來處理PUT請求的_method參數似乎不適用於JSON Content-Type。見Using HTTP PUT to send JSON with Jquery and Rails 3
var todoList = {};
$.getJSON("https://stackoverflow.com/users/123/todolists/456.json", function(data) {
loadTodoList(data);
...
});
function loadTodoList(data) {
todoList = data.todoList;
}
function saveTodoList() {
$.ajax({
type: 'POST',
url: "https://stackoverflow.com/users/123/todolists/456",
data: JSON.stringify({ todoList: todoList }),
contentType: 'application/json',
dataType: 'script', // could be "json", "html" too
beforeSend: function(xhr){
xhr.setRequestHeader("X-Http-Method-Override", "put");
}
});
}
在服務器端,滑軌可以很容易地處理JSON太(JSON序列化和反序列化是由框架自動,透明地執行)。我只是覆蓋了我的TodoList模型上的to_json()方法,以避免來回傳遞無用數據(例如,create_at,modified_at屬性)。在獲取我的頂級對象(即TodoList)時也必須確保包含所有嵌套對象。
# TodoListsController
def show
@todolist = TodoList.find_by_id(params[:id], :include => [:tasks, ...])
respond_to do |format|
format.json do
render :json => @todolist.to_json
end
end
end
# TodoList model
def to_json
super(:only => :name,
:include => { :tasks => { :only => [:name, :description, ...],
:include => ... }})
end
客戶端持久性
的這裏的目標是避免尚未保存不慎丟失用戶編輯。到目前爲止,我直接使用HTML5本地存儲(localStorage變量),但最終會尋找一個jQuery插件,如果HTML5不受支持,它會自動處理cookie存儲的回落。
動態HTML生成
我靠jQuery Template生成HTML。構建器的主要功能是動態生成HTML,因此該插件非常方便。我爲我的待辦事項列表模型(例如任務,筆記...)的所有構建塊定義了模板。每當這些對象的新實例被創建並且需要被渲染時,模板都會被調用。
我認爲這奠定了大部分的基礎。剩下的大部分是鐵桿Javascript來處理所有與表單/ todoList構建器的用戶交互。
我有一種感覺,你的問題 - 雖然有趣 - 但是有點太模糊了。如果你能夠把它分成更小的部分,更詳細地展示你在哪裏以及你在哪裏撞牆,人們可能會更好地幫助你。祝你好運! – polarblau 2011-01-22 17:31:02
謝謝。我發佈了一個答案,以更新我的進度。 – mbreining 2011-01-23 01:25:51