更改dependentObservable()函数,以启用链式写入

时间:2012-04-24 23:42:47

标签: knockout.js

我发现(感谢KO论坛)对于计算的observable,不可能像这样链接写: viewModel.someComputed(20).otherComputed(100).someObservable('hi')

这让我感到很失望,因为我有许多我想要extend()的可观测量 - 所以它们会被计算出来,所以我必须删除所有链接的调用。

所以我在dependantObservable()函数中做了这个小改动(刚添加:return this;)

function dependentObservable() {
    if (arguments.length > 0) {
        set.apply(dependentObservable, arguments);
        return this;
    } else {
        return get();             
    }
}

现在我可以连结写作了!

我的问题是:这样做的缺点是什么? 我假设有一个,因为没有实现:P

谢谢, Uri G

1 个答案:

答案 0 :(得分:3)

不会有任何问题。首先,在更改之前编写的所有代码都假定计算的observable不可链接,因此没有人会使用setter返回的值。其次,使用返回值的所有地方都在调用getter。

换句话说,所有遗留代码都是

var value = obj.property(); // note the lack of parameters
obj.property(value); // note the absence of either chaining or assignment

不链接此代码:

obj.property(value).anything

会抛出类型错误。所以唯一需要担心的是

someVar = obj.property(value); 

目前始终返回undefined。至于我,它看起来像一个相当虚伪的代码,因为有更好的方法将一些变量设置为undefined

所以如果你想让chainig接受这个改变。

  

知道为什么没有实施吗?

因为在大多数传统语言(Java,C#,C ++,PHP)中,链接通常是一个例外而不是常态。在JavaScript世界中,只有少数库使用链接,如jQuery,Underscore和d3。但是,大多数其他库(包括Knockout)都不依赖它。

Steve Sanderson也可能忘记为计算的观察者提供支持。给他一个建议;)