KnockoutJs可观察数组通过计算可观察到的油门

时间:2014-02-03 20:09:36

标签: knockout.js ko.observablearray computed-observable

我有一个问题,我有一个基础的可观察数组,它通过计算的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 -->

1 个答案:

答案 0 :(得分:0)

我认为问题在于shouldBeVisible函数。如果它读取了underlyingArray可观察对象,则该可见绑定将依赖于该可观察对象。当您调用removeAll时,可见绑定将更新。

如果你限制计算,filteredDetails会延迟重新计算,但是应该立即重新评估beBeVisible。

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

首先更改从filteredDetails传递当前项目中的可见绑定,然后评估条件。如果需要使用underlyingArray observable,请使用.peek()以避免依赖。 filteredDetails 最终重新计算。

<!-- ko foreach: filteredDetails -->
   <div data-bind="visible: shouldBeVisible($data)"></div> 
<!-- /ko -->