observableArray
配列 ( ) 内のすべての要素をループし、配列から適切なアイテムを返す関数を作成したいとします。
computed
これを処理する関数を作成ko.utils.arrayFilter
し、フィルタリングを行うために使用することを考えていました。
このアクションをキャッシュする必要がありますか? または、computed
または はarrayFilter
内部でそれを行いますか?
observableArray
配列 ( ) 内のすべての要素をループし、配列から適切なアイテムを返す関数を作成したいとします。
computed
これを処理する関数を作成ko.utils.arrayFilter
し、フィルタリングを行うために使用することを考えていました。
このアクションをキャッシュする必要がありますか? または、computed
または はarrayFilter
内部でそれを行いますか?
計算されたオブザーバブルの値はキャッシュされます。それらの値は、最初にのみ計算され、依存関係が変更されるたびに計算されます。そのため、計算された値に何度もアクセスして、常にキャッシュされた値を受け取ることができます。
あなたのコメントに基づいて、特定の引数に基づいて計算されたオブザーバブルを作成したいようです。その手法に関するいくつかの考慮事項:
単一要素のバインディングは、依存関係を追跡するために計算されたオブザーバブル内で実行されます。つまり、UI でフィルターを使用するだけの場合は、計算されたオブザーバブルの作成を実際に回避し、フィルター関数を直接呼び出すことができます。依存関係が変更されるたびに、バインディングが起動し、関数が再度実行されます。フィルタリングされたデータをプログラムで操作したい場合、これは最善の解決策ではありません。ここにサンプルがあります: http://jsfiddle.net/rniemeyer/QSgPz/
この概念を頻繁に使用する場合は、observableArrays を拡張して、次のように observableArray から直接フィルターを呼び出すこともできます: http://jsfiddle.net/rniemeyer/VhCVc/
別の方法として、計算されたもの自体を返す関数がある場合は、必要な計算されたフィルターごとに一度だけ呼び出していることを確認する必要があります。バインディングが起動されるたびに再作成されるバインディングから呼び出すことは望ましくありません (init で適切に処理するカスタム バインディングがない限り)。ここにサンプルがあります: http://jsfiddle.net/rniemeyer/JrHnT/。繰り返しますが、これを頻繁に使用する場合は、observableArrays を拡張して計算を作成できるようにすることができます。
したがって、バインディングからこれのみを使用している場合は、バインディングが独自の計算されたオブザーバブルを使用するため、計算されたものをスキップして関数のみを使用することを選択できます。ビュー モデルから操作する必要がある場合は、そこでフィルターを作成することをお勧めします。