初学者可以忽略这篇文章,因为大部分都用不着,高级用户可以参考如下内容:
先看个例子:
function AppViewModel() { var self = this; self.firstName = ko.observable('Bob'); self.lastName = ko.observable('Smith'); self.fullName = ko.computed(function innerFun() { return self.firstName() + " " + self.lastName(); }); }
如上例,为了在innerFun函数中使用firstName 、lastName 俩个属性,又单独定义了self内部变量,通过self.firstName() 来访问,即通过闭包来访问。否则无法访问。为了解决上面的问题knockout为ko.computed()方法还提供了一个参数,通过这个参数我们可以很方便,并且很优美的为view model添加依赖属性,看如下的例子:
function AppViewModel() { // ... leave firstName and lastName unchanged ... this.fullName = ko.computed(function innerFun() { return this.firstName() + " " + this.lastName(); }, this);//将this作为参数传入 }ko.computed()传入俩个参数:innerFun函数、this。这样在innerFun函数内部就可直接使用this.firstName() 、this.lastName () 。这是为什么那:
其实,KO在调用innerFun函数时,会将第二个参数(目前是this)传给innerFun函数的this对象,这样innerFun函数的this对象实际指向的是AppViewModel。
在看下动态添加依赖属性的情况:
var viewModel = { firstName: ko.observable('Bob'), lastName: ko.observable('Smith') };添加依赖属性:
viewModel.fullName = ko.computed(function innerFun() { return this.firstName() + " " + this.lastName(); }, viewModel);此时是将viewModel作为参数传入到innerFun函数的this对象,效果是一样的。当然这里的函数名innerFun可以不写,我只是为了区分方便。