这个问题更多地与如何使用Knockout构建代码或更准确地说是MVVM模式中的模型的责任有关。我正在使用Knockout和Durandal,但问题可能是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或模型中。
答案 0 :(得分:2)
老实说,我会把你的模型归类为视图模型。您的模型是您从Ajax调用中获取的json对象,并为每个对象创建一个视图模型。就我而言,嵌套视图模型没有问题。
答案 1 :(得分:1)
Knockout并没有真正实现MVVM;它更像是VVM。像Backbone等人的其他库使用模型;淘汰赛真的没有。为了Knockout中的MVVM,你的“模型”是你的服务器端数据库实体。