2014-02-03 4 views
0

У меня есть проблема, когда у меня есть базовый наблюдаемый массив, который сортируется и экспонируется через вычисленный наблюдаемый. Хотя теперь у меня проблема, если, если я затушевываю вычисленное наблюдаемое, это вызывает проблему при вызове 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 --> 
+0

Возможно, какой-то код поможет. Но, не видя никакого кода вообще, возможно, другой наблюдаемый может быть использован в начале вашего вычисленного наблюдаемого для контроля выполнения остальной части вычисляемого. –

+0

Это длинный надуманный сценарий, я могу показать основы, но очень сложно показать каждую его часть. Измените вопрос, чтобы лучше отобразить проблему. – Grofit

+0

Почему вы делаете removeAll? Когда вы снова извлекаете данные с сервера, просто назначьте его исходному массиву. Нокаут позаботится обо всем остальном. – CtrlDot

ответ

0

Я думаю, что проблема с shouldBeVisible функции. Если это читает наблюдаемый нижележащий массив, тогда видимое связывание будет зависеть от наблюдаемого. Когда вы вызываете removeAll, видимое связывание будет обновляться.

Если вы дросселируете вычисленные, отфильтрованные детали, то задержка перерасчета будет отложена, но shouldBeVisible будет немедленно пересчитан.

Функция shouldBeVisible принимает экземпляр данных, но ничего не передается, когда видимое связывание выполняет функцию. Эта функция также НЕ должна получать доступ к чему-либо за пределами переданных данных.

Начните с изменения видимой привязки, проходящей в текущем элементе из фильтрованныхDetails, затем оцените условие. Если вам нужно использовать наблюдаемый basicArray, используйте .peek(), чтобы избежать зависимости. filterDetails будет в конечном итоге переработан.

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

Извините, ошибка кодирования - это моя ошибка, это на самом деле обработчик кликов, который автоматически передает текущий элемент в итерации, обновит код, чтобы отразить это. – Grofit