today没事干看了下KnockOut。
感觉蛮有趣的。
这个框架是个很有爱的框架, 真的能减少不少工作量
不过就是又个调用比较恶心
就是:
关于this的问题。
众所周知javascript里面, this确实是一个很恶心的事情。
因为this是动态的, 所以很多框架动不动就需要你提供this。
可恨的是javascript里面啊, 不像C#那样有严格的编译机制。
也就是说有的参数给不给都行, 怎么写都不出错
不过运行的时候可不一定不出错。
这下就麻烦了。
我们看以下的例子:
function AppViewModel() {
// ... leave firstName and lastName unchanged ...
this.fullName = ko.computed(function() {
return this.firstName() + " " + this.lastName();
}, this);
}
注意结尾那个this。
很显然, 里面的function无法知道this应该绑定到哪, 所以要求使用framework的人提供个this。
这样他在apply的时候也好知道怎么办。
可是这个有个很严重的问题啊:
如果客户忘记了this怎么办?
那么它就成了undefined了(我有罪。。。)
不管怎么说, 框架不知道this是谁了。 这是关键。
那么关键来了:如何确保用户提供这个参数?
其实这个是不好办的。
除非强制这么定义:
// ... leave firstName and lastName unchanged ...
this.fullName = ko.for(this).computed(function() {
return this.firstName() + " " + this.lastName();
}, this);
}
如果单独用个for方法来返回一个对象, 返回:
{
koFramework:koFramwork,
owner:this
}
然后computed方法是挂在这个上面的
那么一切就好办的多了。
你如果不先for一次, 是没有computed方法可以调用的。
这样, 就不担心用户少些this了。
而且:读起来也更顺一些。
当然了, 最顺的应该是:
ko.computed(function(){}).for(this);
不过这样似乎可能大概, 要稍稍麻烦一点。 我是说写框架的人。
不过也不一定。 前面的都只是定义, for的时候才加载执行
类似延迟加载一样。 估计也不会怎么麻烦。