javascript - 带有 Knockout.js 的 MVVM

标签 javascript mvvm knockout.js

我正在尝试实现基于 MVVM 的单页应用程序,目前正在使用框架 Knockout.js 来处理 MVVM 的 View 模型/ View 部分。不过我很困惑,因为我看过的实现 Knockout 的每个示例都涉及将整个 View 模型保存到数据库中。这些示例是否缺少“模型”步骤,其中 View 模型与数据层模型同步,模型执行验证/服务器同步。

我想在单个页面上有多个不同的模板/ View ,每个模板/ View 都有不同的 View 模型。我发现 knockout.js 缺少的另一件事是跨不同 View 同步单个模型(不是 View 模型)。我认为让每个 View 共享一个巨大的 View 模型是没有意义的,所以我在想每个 View 都有自己的 View 模型,但每个 View 模型都会与只需要几个应用程序范围的模型的字段同步每个 View 。

我正在处理的页面获取了一个巨大的模型(30 多个字段,多层父/子关系),我认为让我的所有 View 模型与该模型同步是有意义的。我研究了 Knockback.js(它结合了 knockout.js 和 backbone.js),但是我最终重写了大部分函数,​​例如获取、设置、保存,因为页面正在从 API 获取数据(我可以'只是将整个模型与服务器来回同步)所以我决定反对它。

我的应用程序的可视化示例:

(模型层) 男|中号

( View 模型/ View 层)VM-V | VM-V | VM-V |虚拟机-V


另一个例子

一个示例模型是 User = {firstName: "first", lastName: "last", ... }

一个 View 模型只需要名字,另一个 View 模型只需要姓氏
ViewModelA={名字:app.User.firstName()}
ViewModelB={名字:app.User.lastName()}

为模型和 View 模型更改定义发布/订阅系统的唯一方法是这样做吗?这甚至是好的/可维护的架构吗?我在这里错过了一个基本概念吗?欢迎所有建议。

最佳答案

如果我没看错的话,这里有很多问题都集中在如何使用 Knockout 构建 MVVM/SPA 上。正如您所指出的,有几件事需要解决。一是如何在 View 模型/ View 对之间进行通信。

掌握 ViewModel 一种方法是将主视图模型作为@Tyrsius 的答案。您的 shell 可以有一个绑定(bind)更多可用数据的 View 模型。主视图模型也可以编排 subview 模型。如果你走这条路,那么你必须小心地将外壳绑定(bind)到主视图模型,并将内部绑定(bind)到 DOM 中的特定 HTML 元素。如果需要,主视图模型可以促进它们之间的通信。

解耦 View / View 模型对 另一种选择是使用 View 模型/ View 对,而不使用主视图模型。每个 View 都被加载到 DOM 的一个区域中并独立绑定(bind)。它们充当独立的单元并且彼此解耦。您可以使用 pub/sub 然后在两者之间进行对话,但如果您只需要一种通过可观察对象同步数据的方法,Knockout 提供了许多选项。我喜欢的是让每个 View 模型表面模型对象。所以一个 View 有一个 View 模型,它显示特定于 View 的数据(来自模型)。如此多的 View 模型可能以不同的方式呈现相同的模型。因此,当 View 更新 View 模型属性(在模型中)时,它会波及到任何其他也使用相同模型的已加载 View 模型。

数据上下文 更进一步,您可以创建一个数据上下文模块来管理模型中的数据。您向数据上下文询问模型(例如:客户列表),数据上下文检查是否已经将它们缓存,如果没有,它会从 ajax 调用中获取它们。无论哪种方式,都是从 View 模型和模型中抽象出来的。数据上下文获取数据并将模型返回给 View 模型。这样你就非常解耦了,但你可以通过数据上下文共享数据(你的模型)。

我可以继续……但请告诉我这是否能回答您的问题。如果不是,很乐意回答任何其他具体问题。

** 免责声明:我正在 SPA 上构建 Pluralsight 类(class)(使用 Knockout 和此策略):-)

关于javascript - 带有 Knockout.js 的 MVVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11250075/

相关文章:

javascript - Webpack 错误 : You may need an appropriate loader to handle this file type. | @字符集 "UTF-8";

javascript - 表中的第 N 个 child 不工作 Javascript

Swift:ViewModel 应该是结构体还是类?

.net - .Net 中的 MVVM 与 Cocoa 中的 MVC 有何不同?

knockout.js - Durandal 路由: Mapping a route with an id?

javascript - 在$http.then()中做事,然后返回promise

javascript - facebook 上的 html flash 播放器与 BiliBili

mvvm - 查看 Xamarin.Forms 中的绑定(bind)错误

javascript - 为什么 ASP.NET MVC 无法识别 knockout

javascript - 在knockout.js中绑定(bind)多个viewmodel