55

ノックアウトを使用する場合、単純な関数ではなく読み取り専用の計算されたオブザーバブルを使用する利点は何ですか?

たとえば、次のビューモデル コンストラクターと html スニペットを見てみましょう: </p>

var ViewModel = function(){
    var self = this;
    self.someProperty = ko.observable("abc");
    self.anotherProperty = ko.observable("xyz");
    self.someComputedProperty = function(){
        return self.someProperty() + self.anotherProperty();
    };    
};

<input data-bind="value: someProperty"/>
<input data-bind="value: anotherProperty"/>
<p data-bind="text: someComputedProperty()"></p>

ここにあるものはすべて期待どおりに機能しているように見えるので、代わりに使用する必要がある理由はありますか:

​var ViewModel = function(){
    var self = this;
    self.someProperty = ko.observable("abc");
    self.anotherProperty = ko.observable("xyz");
    self.someComputedProperty = ko.computed(function(){
        return self.someProperty() + self.anotherProperty();
    });    
};


<input data-bind="value: someProperty"/>
<input data-bind="value: anotherProperty"/>
<p data-bind="text: someComputedProperty"></p>

http://knockoutjs.com/documentation/computedObservables.htmlのドキュメントには、「...宣言型バインディングは計算されたオブザーバブルとして単純に実装される」と記載されていることに気付きました。これは、ビューモデルで明示的に使用する必要があることを意味しますか? ?

4

1 に答える 1

76

計算されたオブザーバブルの唯一の目的がそれに対して単純なバインドを行うことである場合、関数を使用することは同等です。バインディングは、依存関係を追跡するために計算されたオブザーバブル内に実装されるため、オブザーバブルのいずれかが変更されるとバインディングが再トリガーされます。

計算されたオブザーバブルと関数について考慮すべき点がいくつかあります

  • 計算されたオブザーバブルの値はキャッシュされるため、作成時と依存関係の更新時にのみ更新されます。通常の関数の場合、毎回ロジックを実行する必要があります。多くのことがその値に依存している場合 (たとえば、コレクション内の各アイテムが親の値に対してバインドされている場合)、このロジックは何度も実行されます。

  • JavaScript では、他のオブザーバブルと同様に、計算されたオブザーバブルを自由に使用することもできます。これは、それらに対して手動のサブスクリプションを作成し、他の計算からそれらに依存できることを意味します (関数を呼び出すと、この依存関係も作成されます)。KO の通常のユーティリティ メソッドに依存してko.utils.unwrapObservable、関数として呼び出す必要があるか、値を取得しないかを一般的に判断できます。

  • 最終的に値をサーバーに送信したい場合、計算されたオブザーバブルは JSON 出力に自然に表示されますが、通常の関数の結果である値は JSON に変換されると消えてしまいます (より多くの作業を行う必要があります)。最初にその関数からプロパティを設定します)。

于 2012-07-17T17:55:33.993 に答える