web-dev-qa-db-ja.com

ノックアウト:計算された観測可能対関数

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

たとえば、次のビューモデルコンストラクターとHTMLスニペットを使用します。

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 のドキュメントには、「...宣言的バインディングは単に計算されたオブザーバブルとして実装されている」と書かれていることに気づきました。私のビューモデルでそれらを明示的に使用するには?

54
Duncan

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

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

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

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

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

74
RP Niemeyer