1

(KO フォーラムのおかげで) 計算されたオブザーバブルの場合、次のように書き込みをチェーンすることはできないことがわかりました。 viewModel.someComputed(20).otherComputed(100).someObservable('hi')

そして、私が望む多くのオブザーバブルがあるので、これは私を悩ませましたextend()-そしてそれらは計算されるので、チェーンされた呼び出しをすべて削除する必要があります。

そのため、dependentObservable() 関数に小さな変更を加えました (追加: return this;)。

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

そして今、私は書き込みを連鎖させることができます!

私の質問は次のとおりです。これを行うことの欠点は何ですか? これは実装されていないので、あると思います:P

ありがとう、ウリG

4

1 に答える 1

3

問題はありません。まず、変更前に記述されたすべてのコードは、計算されたオブザーバブルは連鎖可能ではないため、セッターによって返された値を誰も使用しないと想定していました。第 2 に、戻り値が使用されるすべての場所で 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 は、計算されたオブザーバブルの連鎖サポートを入れるのを忘れていた可能性があります。彼に提案を送ってください;)

于 2012-05-04T13:35:14.383 に答える