Bootstrap typeahead не работает с моим следующим кодом

У меня есть код для поиска мест. Сервер правильно возвращает данные в формате json, но typeahead не показывает результаты.

<script type="text/javascript">
$(document).ready(function(e) {
    $('#txt_ser').typeahead({
      minLength:1,
      source: function (query, process) {
          var places = [];
          var map = {};
          $.ajax({
              dataType: "json",
              url: "<?php echo base_url() . "ajax/ser";?>",
              data: 'q='+query,
              type: 'POST',
              success: function (data) {
                  $.each(data, function(i, place){
                      map[place.yt_center_state] = place;
                      places.push(place.yt_center_state);
                  });
                  return process(places);
               }
          })
      }
    });
});
</script>

Сервер возвращает данные в формате json. Пример показан ниже при вводе ключевого слова pune.

0: {yt_center_top_city:pune, yt_center_state:MH}
1: {yt_center_top_city:pune, yt_center_state:MH}
2: {yt_center_top_city:pune, yt_center_state:MH}
3: {yt_center_top_city:pune, yt_center_state:MH} 

person Om Shanker    schedule 24.07.2013    source источник
comment
в консоли есть ошибка? У меня есть некоторые сомнения по поводу синтаксиса "<?php echo base_url() . "ajax/ser";?>", но я не специалист по PHP.   -  person Arun P Johny    schedule 24.07.2013
comment
Также на сервер отправляется запрос ajax, и вызывается обратный вызов успеха.   -  person Arun P Johny    schedule 24.07.2013
comment
нет ошибки, я добавил данные json, которые возвращаются сервером с кодом состояния 200   -  person Om Shanker    schedule 24.07.2013
comment
Этот вопрос не имеет ничего общего с PHP   -  person Mike    schedule 24.07.2013


Ответы (1)


Вы не вернули результат своего ajax-запроса в typeahead source. Эта строка вашего кода:

 return process(places);

находится внутри success обработчика $.ajax, поэтому он возвращает только places этой функции.

Вы должны изменить свой код на:

$('#txt_ser').typeahead({
  minLength:1,
  source: function (query, process) {
      var places = [];
      var map = {};
      return $.ajax({   // <- add return here
          dataType: "json",
          url: "<?php echo base_url() . "ajax/ser";?>",
          data: 'q='+query,
          type: 'POST',
          success: function (data) {
              $.each(data, function(i, place){
                  map[place.yt_center_state] = place;
                  places.push(place.yt_center_state);
              });
              return process(places);
          }
      });
  }
});

Надеюсь, поможет

person Hieu Nguyen    schedule 25.07.2013
comment
Нет, это не работает и после изменения кода... Сервер отправляет данные в формате JSON. Эта часть моего сайта действительно причиняет мне боль... - person Om Shanker; 28.07.2013
comment
Хм, если вы сделаете console.log(places); перед return process(places);, сможете ли вы увидеть ожидаемое places? В противном случае я думаю, что у цикла foreach есть проблема. - person Hieu Nguyen; 31.07.2013
comment
console.log отображает результат, например [MH, MH, MH, MH] - person Om Shanker; 08.08.2013
comment
Тогда я уверен, что ваша проблема заключается в чем-то другом. Проверьте мою скрипку здесь с почти идентичными данными: jsfiddle.net/hieuh25/AT3SF/1 - person Hieu Nguyen; 08.08.2013