2013-08-12 2 views
0

Я использую фильтр для нокаута для фильтрации элементов. Но если число более 1000 записей, то оно возвращает данные очень медленно. Что я должен сделать для этого? Вот мой методМассивный фильтр очень медленно возвращает данные.

viewModel.filteredData = ko.computed(function() { 
var str = "<temp>"; 
if (viewModel.selection() == "All") return viewModel.dataOne(); 
return ko.utils.arrayFilter(viewModel.dataOne(), function (data) { 
    stringFromArray = data.display; 
    if (stringFromArray.indexOf(str) == 0) { 
     return true; 
    } 

    }); 
}); 

Вот мой fiddle

Когда я выбираю опцию «All», то она будет загружать все данные и, если выбрать «Selected», то он будет фильтровать записи. Прямо сейчас у меня нет большого количества записей в моей скрипке, поэтому ее фильтрация довольно быстро. Но в моей реальной жизни у меня есть более 5000 записей, и для отображения всех записей требуется 10 секунд. Я имею в виду, что я загружаю данные из своего сервиса, а данные загружаются и выбирается кнопка «Все». Затем я выбираю кнопку «Выбранные», которая фильтрует запись за 3-5 секунд. Теперь, когда я снова нажимаю кнопку «Все», для перезагрузки данных требуется 10 секунд. Как я могу улучшить скорость.

Я также прочитал о вопросе here, но не смог его понять.

Update1

я решил сделать на стороне сервера подкачки. Может ли кто-нибудь дать мне ссылки на страничный пейджинг на стороне сервера, используя kogrid? Я использую службы WCF для извлечения данных. Нужно ли мне передавать параметр pageize для обслуживания каждый раз при его вызове. Дайте мне знать, если есть пример использования kogrid с wcf-сервисом.

+2

не выглядит так, как будто это фильтр массива. Это рендеринг этого большого объема данных, который будет вашей горлышкой бутылки. У меня есть скрипка с более чем 2600 предметов. Я поставил пару таймеров, чтобы посмотреть, сколько времени это займет. Фильтр массива занимает всего 2 мс, а «Все» даже не попадет в ваш arraFilter, даже если он занимает менее 1 мс. Оказание этого объема данных, безусловно, замедлит работу. Введите данные, установите предел (скажем, 10 за раз и посмотрите, как обстоят дела). –

+0

@sujesharukil должен ли я делать подкачку на стороне клиента или на стороне сервера? – Happy

+0

будет более выгодным, так как это действительно большой кусок данных, которые вы сбрасываете, что дорого. –

ответ

0

Может быть, это ссылка здесь поможет ..

Iterating through a list of users and pushing to an array in knockout

Это, как вы бы настроить ViewModel для включения подкачки.

И эта ссылка здесь

Make a WCF Service Accept JSON Data from jQuery.AJAX()

поможет вам получить работу WCF службы. Разумеется, данными будут данные поискового вызова из первого канала.

+0

Итак, согласно вашей первой ссылке, мне не нужно создавать какие-либо параметры в службе wcf для отправки pagenumber? Поэтому, когда я звоню на службу, он вернет мне все данные? Если я получаю все данные с сервера сразу, значит, это означает, что страница подкачки сервера? – Happy

+0

Неправда. Эти ссылки - всего лишь пример того, как вы можете настроить оповещение для отображения. Вы по-прежнему будете передавать свои текущие номера, totalRecordsToReturn и totalRecords (в ​​своей базе данных). Это вы можете упаковать в DTO (модель, POCO), который будет передаваться с каждым запросом поискового вызова. Возврат с сервера (служба WCF) должен быть arrayOfRecords, totalRecords (в ​​вашей базе данных). На основе этих двух значений вы можете показать свою сетку. Надеюсь, это поможет. –