敲除视图模型声明为对象文字与函数的区别
在淘汰赛js中,我将视图模型声明为:
var viewModel = {
firstname: ko.observable("Bob")
};
ko.applyBindings(viewModel );
要么:
var viewModel = function() {
this.firstname= ko.observable("Bob");
};
ko.applyBindings(new viewModel ());
两者之间有什么区别,如果有的话?
我确实在knockoutjs google group上找到了这个讨论,但它并没有给我一个满意的答案。
如果我想用一些数据初始化模型,我可以看到一个原因,例如:
var viewModel = function(person) {
this.firstname= ko.observable(person.firstname);
};
var person = ... ;
ko.applyBindings(new viewModel(person));
但是如果我不这样做,那么我选择哪种风格至关重要?
使用函数来定义视图模型有两个好处。
主要优点是您可以立即访问与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);
在这种情况下,您可以直接在计算的observable中使用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,您可以确保将其从整体视图模型中移除。
另一种选择是使用bind
,如果不支持,则由现代浏览器支持并由KO添加。 在那种情况下,它看起来像:
var ViewModel = function() {
this.items = ko.observableArray();
this.removeItem = function(item) {
this.items.remove(item);
}.bind(this);
};
关于这个话题还有很多可以说的话,以及你可以探索的许多模式(比如模块模式和揭示模块模式),但是基本上使用一个函数可以给你更多的灵活性和控制对象被创建的方式以及引用的能力变量是实例专用的变量。
我使用了不同的方法,虽然类似:
var viewModel = (function () {
var obj = {};
obj.myVariable = ko.observable();
obj.myComputed = ko.computed(function () { return "hello" + obj.myVariable() });
ko.applyBindings(obj);
return obj;
})();
几个原因:
this
,当在ko.computed
s等内使用时会混淆 new viewModel()
) 上一篇: Difference between knockout View Models declared as object literals vs functions