现在的位置: 首页 > 综合 > 正文

KnockOut设计吐槽

2012年11月12日 ⁄ 综合 ⁄ 共 1127字 ⁄ 字号 评论关闭

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是谁了。 这是关键。

 

那么关键来了:如何确保用户提供这个参数?

 

其实这个是不好办的。 

 

 除非强制这么定义:

  

function AppViewModel() {
    // ... 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的时候才加载执行

类似延迟加载一样。 估计也不会怎么麻烦。 

 

抱歉!评论已关闭.