2011-04-14 44 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

相关问题