0

我有一个问题,我有一个底层的 observable 数组,它通过计算的 observable 进行排序和公开。removeAll虽然我现在有一个问题,如果我限制计算的 observable,在调用底层数组时似乎会导致问题。

这个场景非常复杂,但基本上我在缓冲区部分有一组大约 0-200 行,这是可观察的数组,然后我根据用户选择的选项卡显示该数组的部分。因此,在 100 条记录中,我只能在计算的 observable 中将其过滤到 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 函数上。如果它读取了底层数组 observable,那么该可见绑定将依赖于该 observable。当您调用 removeAll 时,可见绑定将更新。

如果限制计算,filteredDetails 将延迟重新计算,但 shouldBeVisible 将立即重新评估。

shouldBeVisible 函数接受一个数据实例,但在可见绑定执行该函数时没有传递任何内容。此函数也不应该访问传递的数据之外的任何内容。

首先更改从过滤详细信息中传入当前项目的可见绑定,然后评估条件。如果你需要使用底层数组 observable,使用 .peek() 来避免依赖。filtersDetails最终将重新计算。

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