【发布时间】:2013-04-03 15:00:27
【问题描述】:
这个问题更多地与如何构建代码有关,或者更准确地说是关于使用 Knockout 的 MVVM 模式中模型的职责。我正在使用带有 Durandal 的 Knockout,但这个问题可能是 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);
};
我的 viewModel 收集了我的模型,例如:
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 或模型中的区别在哪里?
【问题讨论】:
-
Model 代表系统中的实体,而 ViewModel 是 UI 模型。模型应该与持久性/后端交互以更新自身。 ViewModel 将在模型和 UI 之间架起一座桥梁(两种方式)。后端 模型 ViewModel 视图
-
在上述情况下,我的模型与后端交互以更新它的计数值,此外它还有一个可观察的属性,它有两种方式绑定到视图。但是在阅读了下面的答案后,我更倾向于将其视为 viewModel。如果我错了,请纠正我。
-
对于 UI 绑定,您的 Model 和 ViewModel 都是 ViewModel。但是,不要忘记 Model 是域模型,例如用户、产品等,而 ViewModel 是特定于 UI 的。
标签: javascript mvvm knockout.js durandal