我有一个问题,我有一个基础的可观察数组,它通过计算的observable进行排序和公开。虽然我现在有一个问题,如果我限制计算的observable,它似乎在底层数组上调用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 -->
答案 0 :(得分:0)
我认为问题在于shouldBeVisible函数。如果它读取了underlyingArray可观察对象,则该可见绑定将依赖于该可观察对象。当您调用removeAll时,可见绑定将更新。
如果你限制计算,filteredDetails会延迟重新计算,但是应该立即重新评估beBeVisible。
shouldBeVisible函数接受一个数据实例,但是当可见绑定执行该函数时,不会传递任何内容。此函数也不应访问传递数据之外的任何内容。
首先更改从filteredDetails传递当前项目中的可见绑定,然后评估条件。如果需要使用underlyingArray observable,请使用.peek()以避免依赖。 filteredDetails 最终重新计算。
<!-- ko foreach: filteredDetails -->
<div data-bind="visible: shouldBeVisible($data)"></div>
<!-- /ko -->