【问题标题】:'Model' and 'ViewModel' in Knockout.jsKnockout.js 中的“模型”和“视图模型”
【发布时间】:2014-01-03 16:29:24
【问题描述】:

在 MVC 中,“Model”只是数据的代码表示(例如,在 ASP.NET MVC 中,它是一个具有相应字段的类)。

然而,在 Knockout(它使用 MVVM)中,我看到带有字段的对象被称为“ViewModel”。来自官方 KO 文档:

模型:您的应用程序存储的数据。此数据代表对象 和您的业务领域中的操作(例如,可以 执行汇款)并且独立于任何用户界面。使用KO时, 您通常会对一些服务器端代码进行 Ajax 调用以读取和 写入这个存储的模型数据。

视图模型:数据和操作的纯代码表示 一个用户界面。例如,如果你正在实现一个列表编辑器,你的视图 模型将是一个包含项目列表并公开方法的对象 添加和删​​除项目。

从示例中可以看出,ViewModel 是具有字段的对象,保存数据,这通常由 MVC 中的 Model 完成:

var myViewModel = {
    personName: ko.observable('Bob'),
    personAge: ko.observable(123)
};

所以我在这里有点迷路了。 Knockout.js 域中的“模型”和“视图模型”到底是什么意思?

【问题讨论】:

  • 顺便说一句,MVC 是一种架构模式,而不是设计模式。
  • 好吧,看来你是对的,所以我更改了标签(无论哪种方式都是正确的,因为架构模式是更通用的术语)。然而,它是方式不太受欢迎的标签。

标签: javascript model-view-controller mvvm knockout.js architectural-patterns


【解决方案1】:

在 JavaScript 实现的 MVVM 模式中,“模型”部分通常由 web api 提供。提供给页面的数据就是模型。现在,该数据是否包含在 JavaScript 中后是否包含在单独的模型对象中 - 那是另一回事了。

通常一个视图模型只是一个增加了属性和函数的模型以支持它所应用的特定视图。客户端计算、下拉查找值、客户端验证例程等。在这种情况下,视图模型可能如下所示:

var vm = {
    save: function(){ save logic... },
    cancel: function(){ cancel logic... },
    states: ko.observable(), //list of states for state dropdown
    customerId: ko.observable(),
    customerFirstName: ko.observable(),
    customerLastName: ko.observable()
};

其他时候,模型将保存在单独的对象中。在这种情况下,视图模型可能如下所示:

var customerModel = getCustomerFromDataSource();
var vm = {
    save: function(){ save logic... },
    cancel: function(){ cancel logic... },
    states: ko.observable(), //list of states for state dropdown
    customer: customerModel
};

要记住的主要事情是模型是数据,而视图模型是使您的模型可用于视图的层(通常通过数据绑定)。有时模型可能是一个单独的类;其他时候,模型只是视图模型中的一组已知属性。

【讨论】:

  • 这是有道理的,但似乎与 Rails 不一致,其中 Model 是 ORM,实际数据在数据库中。 Knockout 定义“模型”的方式似乎是 Rails 所称的数据库,而 Knockout 没有内置方式来查询您的数据。
【解决方案2】:

型号
模型保存信息,但通常不处理行为

视图
View 包含需要了解 Model 和 ViewModel 的数据绑定、事件和行为。虽然这些行为可以映射到属性,但 View 仍然负责处理 ViewModel 的事件

ViewModel
ViewModel 位于我们的 UI 层后面。它公开了视图(来自模型)所需的数据,并且可以被视为我们的视图用于数据和操作的源。

您可以在以下链接中找到更多信息 here
您还可以在stackoverflow question中找到有关 mvc 和 mvvm 的更多信息

【讨论】:

  • 好的,所以看起来最令人困惑的部分是在大多数情况下根本没有模型展示。似乎在 KO 中,实际模型是 JSON 格式的数据本身或往返于服务器的任何格式。这是我能想到的唯一解释。如果我错了,请告诉我为什么var aViewModel = { contactName: ko.observable('John'); };ViewModelvar Todo = function (content, done) { this.content = ko.observable(content); this.done = ko.observable(done); this.editing = ko.observable(false); };Model?它们之间没有区别
  • 大多数时候 Model 来自 web api,我们只是直接在 ViewModel 中使用。和其他方式 function ProductViewModel() { var self = this; self.Id = ko.observable(""); self.Name = ko.observable(""); self.Category = ko.observable(""); self.Price = ko.observable(""); var Product = { Id:self.Id, Name: self.Name, Category: self.Category, Price:self.Price }; }; 我们为 MVVM 放置了单独的模型。
  • 感谢您的解释,因为您链接的 jsfiddle 很好地阐明了这一点。但不幸的是,我只能赞成你的答案,而不是接受它,因为约瑟夫在几个小时前解释了困难的部分(模型隐藏的地方)。
猜你喜欢
  • 2017-09-01
  • 1970-01-01
  • 2014-10-04
  • 1970-01-01
  • 2017-08-28
  • 2023-03-10
  • 2012-12-11
  • 2015-09-17
  • 2016-09-27
相关资源
最近更新 更多