0

計算されたオブザーバブルを介してソートおよび公開される、基礎となるオブザーバブル配列があるという問題があります。現在、計算されたオブザーバブルを調整するとremoveAll、基になる配列を呼び出すときに問題が発生するように見えるという問題があります。

シナリオは非常に複雑ですが、基本的には、監視可能な配列であるバッファー セクションに約 0 ~ 200 行のセットがあり、ユーザーが選択したタブに応じてその配列のセクションを表示します。したがって、100 レコードのうち、計算されたオブザーバブルで 30 までしかフィルタリングできません。ただし、アレイを無効にして新しいリストをダウンロードする必要があるポイントがあります。これは、個別またはバッチでダウンする可能性があるため、不要な再評価を減らすために調整されます。ただし、基になる配列を無効にしようとすると、removeAllものが変更されたことをビューに通知するように見え、ビューレベルのバインディングを再評価しようとしますが、それらの一部は現在空になっている基になる配列を調べますが、計算されたように巻き込まれずに倒れます。

それで、配列のremoveAllの後に計算されたものに評価を強制する方法はありますか?

これが私が意味することの例です:

var currentFilterType = ko.observable(1); // this is changed in the UI by the user
var underlyingArray = ko.observableArray();
var filteredDetails = ko.computedObservable(filterPredicate);

function filterPredicate() {
   // assume ko.linq is included, this is a simple version of whats happening
   return underlyingArray.Where(function(x){ return x.FilterType() == currentFilterType; })
                         .OrderBy(function(x){ return x.DateCreated(); })
                         .ToObservableArray();
}

function invalidateData() {
   underlyingArray.removeAll();
   // fetch some more data to repopulate array
}

function doSomethingWithItem(data) {
   // check something against the original array
}

// In the view usage would look like this
<!-- ko foreach: filteredDetails -->
   <a data-bind="click: doSomethingWithItem"></a> 
<!-- /ko -->
4

1 に答える 1

0

問題は shouldBeVisible 関数にあると思います。それがunderlyingArrayオブザーバブルを読み取る場合、その可視バインディングはそのオブザーバブルに依存します。removeAll を呼び出すと、表示されているバインディングが更新されます。

計算されたものを調整すると、filteredDetails は再計算を遅らせますが、shouldBeVisible はすぐに再評価されます。

shouldBeVisible 関数はデータ インスタンスを受け取りますが、可視バインディングが関数を実行するときに何も渡されません。この関数は、渡されたデータ以外にはアクセスしないでください。

現在のアイテムで渡される可視バインディングをfilteredDetailsから変更することから始めて、条件を評価します。基本配列オブザーバブルを使用する必要がある場合は、依存関係を避けるために .peek() を使用してください。filteredDetails は最終的に再計算されます。

<!-- ko foreach: filteredDetails -->
   <div data-bind="visible: shouldBeVisible($data)"></div> 
<!-- /ko -->
于 2014-02-04T02:31:38.833 に答える