2011-04-14 81 views
9

我一直在玩KnockoutJS,絕對喜歡它通過防止東西從裂縫中掉落,從多個角度簡化設計。我的問題是將數據保存回服務器的建議「最佳實踐」是什麼?我的理解是,在連接的MVVM中,第一個「M」是數據層,因此ViewModel觸發器中的依賴關係跟蹤和通知直接保存到數據層。在JavaScript應用程序中,我們斷開連接並使用AJAX有選擇地將其保存回服務器。在MVVM/Knockoutjs Web App中保存更改的最佳方法?

我目前正在使用它的應用程序是MVC3,我完全瞭解如何在控制器上編寫「保存」操作,在我的頁面某處放置「保存」按鈕,將整個ViewModel發佈到保存操作然後將其保存到數據庫。但是當你做一個快速編輯然後再保存它呢?或者如果保存按鈕不符合設計流程呢?相反,您希望每次在表單上進行更改時都不會發布保存按鈕?我反彈的想法是:

  • 每次發生任何更改時都會發布整個ViewModel,並使Action瞭解什麼是新的和什麼不是(不理想,特別是對於大型模型,如果沒有否則是因爲每次保存傳輸的數據會不必要地大)。
  • 將屬性添加到ViewModel中的每個項目,以跟蹤自上次保存以來是否新建和/或更改。然後,grep這些項目,並只發布到服務器(我沒有測試過,但我認爲這可以通過使用_destroy屬性來完成,就像Rails應用程序所預期的那樣)。
  • 將許多較小的視圖模型分離爲合理的視圖模型,以便將前兩個選項中的任何疼痛最小化(這可能無論如何都可以完成)。
  • 其他一些更好的方法?

我希望有一些好的想法,我沒有想到。爲了能夠聲明性地綁定所有東西,並且仍然高效地保存會很棒。

+0

你混爲一談MVC(如ASP.NET MVC)和MVVM。它們本質上都是相同的模式,但MVVM具有針對WPF應用程序設計的特定更改。 – Will 2011-04-15 13:02:26

+0

其實KnockoutJS(http://knockoutjs.com)使用MVVM模式,這也是海報所指的。 – 2011-04-15 14:31:04

+0

非常好的問題!沒有Knockout的同一個問題可能會更有用,因爲這只是衆多JS框架中的一個。我會繼續尋找這個問題的答案。 – noocyte 2012-05-04 07:50:49

回答

0

我能想到的唯一的其他事情是subscribing。當我第一次開始閱讀你的帖子時,我正在考慮用w/grep標誌。

編輯:更好的是,ko.utils.compareArrays看起來很有希望。

Here's工作的例子..

唯一剩下要做的就是檢測更改的「保留」值的值。儘管如此,你仍然很好。

+0

哇。 +1爲優雅的實現,我會繼續前進,並將其標記爲現在的答案。這個問題本質上更具理論性,所以我相信還有其他方法,但這個例子的設置方式就是天才。即使在該實現中仍然存在一個保存按鈕,但很酷的部分並不是必須的。只要有東西觸發ko.utils.compareArrays,你就可以有選擇地只發布你關心的數組。這正是我很好奇的。做得好。感謝您的輸入。 – Jorin 2011-04-21 04:25:32

+0

很高興我能幫上忙。 – 2011-04-21 06:07:19

+3

示例鏈接已損壞...該示例仍然有效嗎?我有一個viewmodel有幾個級別的關係,我一直在尋找不同的選項來保存 – littlechris 2011-05-19 12:42:51

5

我剛剛從Mix11回來,在那裏我參加了關於Knockout.js的this session。觀看史蒂夫桑德森可能需要一段時間才能完成一個完整的CRUD演示。

+3

是的,我上週看到了這個精彩的演示,只要它在線發佈。一個真正偉大的演示,展示了Knockout在客戶端可以做什麼,但是當他發佈到服務器時,除了將其傳回給客戶端以顯示它實際上正在服務器上之外,它沒有做任何事情。我更感興趣的是在保存增量更改到服務器時的最佳做法......同時保持有效負載小,控制器高效。 – Jorin 2011-04-18 19:57:35

相關問題