2013-04-11 55 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