2013-10-27 4 views
5

В настоящее время я использую фильтр: запрос для поиска в данных, что-то вроде этогоAngularjs Поиск в больших наборах данных с пагинацией

<input type="text" ng-model="query"> 
<tr ng-repeat="thought in thoughts | filter:query"> 
<td>thought.title</td> 
</tr> 

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

Один подход: для текущего поиска результатов поиск может выполняться обычно с использованием фильтров, если результаты не найдены, вызовите сервер, запрашивающий другой кусок данных. Этот подход хорош?

+0

Ваш подход «один» звучит не так, как если бы он работал хорошо, возможно, вам придется сделать много звонков на сервер, чтобы получить эту последнюю запись. Похоже, вам нужно реализовать серверный поиск. –

+0

Хорошо. поэтому я могу просто отправить запрос на сервер и запросить конкретные данные! – icanbeacoder

+0

может найти здесь модуль, который поможет http://ngmodules.org/ Является относительно новым ресурсом (по крайней мере, для меня), но, похоже, имеет довольно много тяги – charlietfl

ответ

3

Ну, если у вас на вашем сервере API/CGI, который выполняет поиск и возвращает подмножество (например, с помощью SQLs limit start,number), это не так сложно. Когда вы начинаете новый запрос, вы должны установить thoughts в пустой массив и затем выполнить первый вызов API, например. возвращая 10 результатов. И тогда у вас может быть кнопка или какой-либо другой механизм, чтобы сделать следующий вызов API, возвращая результат 11-20. В вашей функции обратного вызова $ http вы просто всегда добавляете данные, возвращаемые сервером, в ваш массив, чтобы новые данные добавлялись в конце. Так что подумайте над чем-то вроде этого (это не фактический протестированный код, просто записанный ради этого ответа):

$scope.getdata = function() { 
    $http.post('/api/whatever', 
    { query: $scope.query, startat: $scope.thoughts.length }) 
    .success(function(response,status,headers,config){ 
     $scope.thoughts.push.apply($scope.thoughts, reponse.data); 
    }); 

$scope.search = function() { 
    $scope.thoughts = []; 
    $scope.getdata(); 
} 

Search for: <input ng:model="query"> 
<button ng:click="search()">Search</button> 
<button ng:click="getdata()">Get more results</button> 
+0

Имейте в виду, что массив мыслей не подвергается дезинфекции в этом примере кода. Он будет дублировать данные. – taco

1

Невозможно выполнить поиск на стороне клиента, если вы не загрузите все данные в клиенте с помощью вашего первого запроса ajax.

Поиск на стороне сервера, вероятно, будет вашим лучшим выбором.

Смежные вопросы