2013-08-12 4 views
3

я следующие поля ввода фрагмента кода здесь я звоню AngularJS $scope метод следующим образом

<input class="search-txt-input" 
     id="partner_name" 
     name="partner_name" 
     title="Partner Name" 
     type="text" 
     autocomplete="off" 
     ng-model="selectedPartner" 
     typeahead="partner as partner.name for partner in retrievePartnerList($viewValue)" 
     typeahead-items="2" 
     typeahead-min-length="3"> 

Так что, когда я печатаю как минимум 3-х символов в текстовое поле, он вызовет вызов AJAX для функции retrievePartnerList.

Также мой ответ сервера очень медленный, поэтому для 10 символов 7 вызовов Ajax приходит в очередь, и через некоторое время я получаю TimeOutError.

Чтобы решить эту проблему, я пытаюсь найти способ, с помощью которого я могу отложить вызов метода retrievePartnerList(), так что будет отправлено меньше вызовов AJAX и, вероятно, это уменьшит нагрузку на мой сервер.

Так что я не знаю, как я могу использовать функцию setTimeout() здесь.

Сообщите мне, если у кого-то из вас есть идеи по этому вопросу.

ответ

11

Да, вы можете легко задержать стреляя согласование по задав атрибут typeahead-wait-ms. Как следует из названия атрибута, оно принимает значение в миллисекундах и будет задерживать соответствие, ожидая указанного количества миллисекунд после того, как пользователь перестанет печатать, прежде чем запускать запросы на сервер.

Вот демонстрационный показ этого в действии: http://plnkr.co/edit/fHLqDx?p=preview

+0

Спасибо за ответ, что он работает в вышеупомянутой скрипте js, но не работает в моем коде, не уверен, что может быть причиной, я просто добавил typeahead-wait-ms = "10000 ». Но все же он запускается после каждого типа ключей –

+0

Я использую версию 0.3.0 API, которая может быть typeahead-wait-ms не добавлена ​​в эту версию. Необходимо проверить –

+0

@DeanM-поддержку для 'typeahead-wait- ms' был добавлен только в версии 0.5.0 (были некоторые предварительные значения в 0.4.0, но 0.4.0 не работает совершенно правильно). Вам нужно будет обновиться до 0,5.0, чтобы он работал как в моем плунтере. –

2

Проверить AngularStrap решение: https://github.com/mgcrea/angular-strap/blob/master/src/directives/typeahead.js

ИЛИ

Это можно легко сделать, как это в JavaScript:

var autocomplete = $('#searchinput').typeahead().on('keyup', delayRequest); 

function dataRequest() { 
    // api request here 
} 

function delayRequest(event) { 
    if(delayRequest.timeout) { 
     clearTimeout(delayRequest.timeout); 
    } 

    var target = this; 

    delayRequest.timeout = setTimeout(function() { 
     dataRequest.call(target, event); 
    }, 200); // 200ms delay 
} 
+0

Спасибо за ответ, но я уже видел этот подход, но в моем случае я не призываю машинописный функцию из JS-файла, но вызвав его из поля зрения автоматически. –

+0

Вы проверили 'AngularStrap': https://github.com/mgcrea/angular-strap/blob/master/src/directives/typeahead.js – EpokK

+1

Я проверил это, но я не понимаю этого, поскольку я новичок в Угловая структура js и имеют базовую IDea своей работы. Для моего проекта я использовал http://angular-ui.github.io/bootstrap/, и я использую модуль Typeahead (пример, приведенный в конце этой ссылки) –

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