2013-04-11 40 views
1

这个问题更多的是关于如何使用Knockout构造代码或者更精确地说MVVM模型中模型的责任。我使用Durandal Knockout,但问题可能是MVVM模式的一个通用问题。对于如MVVM模型的责任

我有型号为这样:

var Model = function(data){ 
     this.name = data.name; 
     this.count = ko.observable(); 
}; 

Model.prototype.getCount = function(){ 
     var self = this; 
     setInterval(function(){ 
      //some ajax call to get the count 
      self.count(data.count); 
     }, 1000); 

}; 

我的视图模型需要我的模型的集合,如:

var ViewModel = function(){ 
     this.models = ko.observableArray([]); 
     //ajax call to get the required data 
     data.Items.forEach(function(item){ 
      var model = new Model(item);  
      model.getCount(); 
      this.models.push(model); 
     } 
}; 

现在我的看法

<div data-bind="foreach: models"> 
    <div data-bind="text: name"></div> 
    <div data-bind="text: count"></div> 
</div> 

我的问题是因为我的模型有一个可观察的属性,每当属性更改时它都会更新视图。但实质上它是一个模型,更新UI的责任应该仅仅依赖于视图模型。

所以应该更新计数的代码基本上是getCount,生活在视图模型和模型是不正确的地方。哪些代码应该保留在viewModel或模型中的区别在哪里?

+3

模型表示系统中的实体,而ViewModel是UI的模型。 模型应该与持久性/后端进行交互以更新自身。 ViewModel将在Model和UI之间搭建桥梁(2种方式)。 后端<->型号<->视图模型<->查看 – 2013-04-11 13:12:46

+0

我在上述情况下的模型与后台交互,以更新它的计数值再加上它也有它有一个双向绑定到视图的观察特性。但在阅读下面的答案后,我更倾向于将其视为viewModel。如果我错了,请纠正我。用于UI绑定的 – nimgrg 2013-04-11 13:52:26

+1

,您的Model和ViewModel都是ViewModel。但是,不要忘记模型是领域模型,例如用户,产品等,而ViewModel特定于UI。 – 2013-04-11 14:16:30

回答

2

我会将你的模型作为视图模型分类,说实话。你的模型是你从Ajax调用中获得的json对象,并且为每一个创建一个视图模型。就我而言,嵌套视图模型没有问题。

+0

我已经对整个概念和你的回答以及其他问题给了一些想法,帮助我解决了我所遇到的疑惑和混乱。谢谢!! – nimgrg 2013-04-12 07:54:05

1

Knockout并未真正实现MVVM;它更像VVM。其他类似Backbone等的库使用模型;淘汰赛真的不会。 Knockout中为了MVVM而使用的“模型”是您的服务器端数据库实体。

+0

授予服务器端实体是模型,但您可以使用更多属性(计算等)修饰该实体。您的视图模型本质上是该模型和视图之间的桥梁,因此视图上的操作将由视图模型处理,并负责对基础模型进行更改。所以ViewModel是包含模型并使其可用于视图的东西。因此,Mode-View-ViewModel。你同意吗? – 2013-04-12 14:38:05

+0

不过,我认为你正在寻找更多的转换而不是真正的模型。如果将模型传递给视图并“修饰它”,或者即使根本不修改它(虽然这很奇怪),但它现在仍然是“视图模型”,而不是模型。您可能会提出这样的观点,即在您实例化视图模型时它短暂地存在于客户端,但之后几乎将其抛弃。要更新模型,您将发布AJAX POSTs来修改服务器端实体,*而不是*其某些客户端版本。 – 2013-04-12 20:53:32

+0

正确。我同意。 – 2013-04-13 01:36:26