У меня есть проблема, когда у меня есть базовый наблюдаемый массив, который сортируется и экспонируется через вычисленный наблюдаемый. Хотя теперь у меня проблема, если, если я затушевываю вычисленное наблюдаемое, это вызывает проблему при вызове removeAll
в базовом массиве.Наблюдаемый массив KnockoutJs через вычисляемый наблюдаемый с дросселем
Сценарий довольно запутанный, но в основном у меня есть набор из примерно 0-200 строк в секции буфера, который является наблюдаемым массивом, тогда я отображаю разделы этого массива в зависимости от выбранной вами вкладки. Таким образом, из 100 записей я могу отфильтровать только до 30 в вычисленном наблюдаемом. Есть точки, в которых мне нужно сделать недействительным массив и загрузить новый список, который может возникать индивидуально или в пакетах, поэтому он дросселируется, чтобы уменьшить ненужные повторные оценки. Однако, когда я пытаюсь сделать недействительным базовый массив с removeAll
, он, как представляется, уведомляет мнение о том, что материал изменился, и он пытается переоценить привязки уровня представления, однако некоторые из них смотрят на базовый массив, который теперь пуст, но как вычисленный не догнал его, падает.
Так есть способ заставить оценку вычислять после удаленияAll на массиве?
Вот пример того, что я имею в виду:
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 -->
Возможно, какой-то код поможет. Но, не видя никакого кода вообще, возможно, другой наблюдаемый может быть использован в начале вашего вычисленного наблюдаемого для контроля выполнения остальной части вычисляемого. –
Это длинный надуманный сценарий, я могу показать основы, но очень сложно показать каждую его часть. Измените вопрос, чтобы лучше отобразить проблему. – Grofit
Почему вы делаете removeAll? Когда вы снова извлекаете данные с сервера, просто назначьте его исходному массиву. Нокаут позаботится обо всем остальном. – CtrlDot