KnockoutJSのcomputed
とpureComputed
の違いは何ですか?
pureComputed
の代わりにcomputed
を安全に使用できますか?
@Jeroenに同意し、J。Munroの book から短い例を追加したいと思います。これは他の人にも役立つかもしれません。
まず、pureComputedオブザーバブルは、計算されたオブザーバブルと非常によく似ていますが、パフォーマンスとメモリがいくつか改善されています。名前は Pure function プログラミング用語から借用されており、ローカル変数のみを使用する関数は潜在的に純粋ですが、非ローカル変数を使用する関数は潜在的に不純であることを意味します。
Knockout.jsのオブザーバブルは異なる方法で処理されます。したがって、pureComputedオブザーバブルはスリープモードになり(Knockoutはすべての依存関係を傾け、読み取り後にコンテンツを再評価します)、計算されたオブザーバブルはリスニングモードになります(Knockoutは最初のアクセスの前に値が最新かどうかを常にチェックします) 。
したがって、他のコードを実行する必要がある場合は、計算されたオブザーバブルを使用することをお勧めします。
function ViewModel() {
var self = this;
self.firstName = ko.observable('Arshile');
self.lastName = ko.observable('Gorky');
self.pureComputedExecutions = 0;
self.computedExecutions = 0;
self.pureComputedFullName = ko.pureComputed(function() {
// This is NOT recommended
self.pureComputedExecutions++;
return 'Hello ' + self.firstName() + ' ' + self.lastName();
});
self.computedFullName = ko.computed(function() {
self.computedExecutions++;
return 'Hello ' + self.firstName() + ' ' + self.lastName();
});
};
var viewModel = new ViewModel();
ko.applyBindings(viewModel);
alert('Pure computed executions: ' + viewModel.pureComputedExecutions);
alert('Computed executions: ' + viewModel.computedExecutions);
このコードを実行すると、pureComputed関数と計算関数が呼び出された回数を示す2つのアラートメッセージが表示されます。 pureComputedはスリープモードになっているため、関数はアクセスされず、カウンターは0を表示します。これとは対照的に、計算された関数はデータバインディングで自動的に評価され、カウンターの数が増えて1が表示されます。
それらはveryに似ています。 違いはpureComputed
にはパフォーマンスの最適化がいくつかあり、誰が変更を追跡するかを賢くすることで、メモリリークを防止しようとすることです。
多くの場合、computed
をpureComputed
で安全に置き換えることができます。計算された内部の関数 これに従う必要があります :
1.計算されたオブザーバブルを評価しても、副作用は発生しません。
2.計算されたオブザーバブルの値は、評価またはその他の「隠された」情報の数に基づいて変化してはなりません。その値は、アプリケーションの他のオブザーバブルの値のみに基づいている必要があります。これは、純粋な関数定義では、そのパラメーターと見なされます。
経験則として、いくつかの通常のobservable
プロパティを単純に変換する計算されたオブザーバブルは、pureComputed
として問題ないはずです。そうでなければ、computed
に固執します。
ドキュメントにはきちんとした説明があります いつ/なぜあなたがすべきかnotpureComputed
observablesを使用します。関連する抜粋は次のとおりです。
依存関係が変化したときにアクションを実行することを意図した計算されたオブザーバブルに対して、純粋な機能を使用しないでください。
評価者に重要な副作用がある場合、純粋な計算を使用すべきではない理由は、計算にアクティブなサブスクライバーがいない(つまりスリープしている)場合に評価者が実行されないためです。評価者が依存関係が変化したときに常に実行することが重要な場合は、代わりに通常の計算を使用します。