使用函数定义视图模型有几个优点.
主要的优点是,您可以立即访问等于正在创建的实例的值this
.这意味着你可以:
var ViewModel = function(first, last) {
this.first = ko.observable(first);
this.last = ko.observable(last);
this.full = ko.computed(function() {
return this.first() + " " + this.last();
}, this);
};
因此,即使从不同的作用域调用,也可以将计算出的可观测对象绑定到适当的值this
.
对于对象文字,您必须执行以下操作:
var viewModel = {
first: ko.observable("Bob"),
last: ko.observable("Smith"),
};
viewModel.full = ko.computed(function() {
return this.first() + " " + this.last();
}, viewModel);
在这种情况下,您可以在计算的可观察对象中直接使用viewModel
,但它确实会立即得到计算(默认情况下),因此您无法在对象文本中定义它,因为直到对象文本关闭后才定义viewModel
.许多人不喜欢视图模型的创建不包含在一个调用中.
另一种确保this
始终合适的模式是,将函数中的变量设置为适当的值this
,然后使用它.这就像:
var ViewModel = function() {
var self = this;
this.items = ko.observableArray();
this.removeItem = function(item) {
self.items.remove(item);
}
};
现在,如果您在单个项的范围内,并调用$root.removeItem
,那么this
的值实际上就是在该级别绑定的数据(即该项).在这种情况下,通过使用self,可以确保将其从整体视图模型中删除.
另一种 Select 是使用bind
,如果不支持,则使用现代浏览器支持并由KO添加的bind
.在这种情况下,它将如下所示:
var ViewModel = function() {
this.items = ko.observableArray();
this.removeItem = function(item) {
this.items.remove(item);
}.bind(this);
};
关于这个主题和您可以探索的许多模式(如模块模式和揭示模块模式),还有更多可以说的内容,但基本上使用函数可以让您更灵活地控制如何创建对象,并能够引用实例私有的变量.