1

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

这让我很沮丧,因为我有很多我想要的 observables extend()- 所以它们会被计算出来,所以我必须删除所有链式调用。

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

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

现在我可以链写了!

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

谢谢, 乌里 G

4

1 回答 1

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 可能只是忘记为计算的 observables 提供链式支持。给他一个建议;)

于 2012-05-04T13:35:14.383 回答