В настоящее время я использую ввод в моем клинке и вызов ajax, чтобы передать значение поля ввода функции, которая запрашивает конечную точку. Это вызывает каждое нажатие клавиши.
Когда я отлаживаю в Chrome и проверяю вкладку сети, я вижу, что он успешно возвращает объект из вызова ajax. Проблема в том, что я зацикливаю объект в списке данных, прикрепленном к полю ввода, и он не заполняется результатами.
Предполагается, что это функция автозаполнения, при которой вызов ajax запрашивает и возвращает результаты, которые будут отображаться и отфильтровываться в списке данных. То, как я зацикливаю объект в моем клинке, работает, когда я копирую объект в файл с жестко заданным значением. Мне интересно, нужно ли мне что-то еще в моем Ajax, чтобы правильно передать его обратно.
Опять же, мой вызов Ajax выполнен успешно и возвращает объект, но что мне нужно сделать, чтобы мой return response()->json($searchResults); вернулся в список данных для ввода?
controller.php
public function autoComplete(Request $request)
{
if ($request->ajax()){
$search_result = $request->search_result;
$service = new service();
$searchResults = $service->getSearch($search_result);
return response()->json($searchResults);
}
}
view.blade.php
<input id = "productInput" class = "uk-search-field" type = "search" placeholder = "search products..." list = "returnedProducts">
<datalist id = "returnedProducts">
@if ($searchResults->hits)
@foreach($searchResults->hits as $arr)
@foreach($arr as $obj)
<option value = "{{$obj->_source->category}}">{{$obj->_source->category}}</option>
@endforeach
@endforeach
@endif
</datalist>
<script type = "text/javascript">
//input event handler
$('#productInput').on('input', function(){
if ($(this).val() === ''){
return;
}else{
const searchResult = $(this).val();
$.ajax({ url: '/account/autocomplete',
data: {
search_result:searchResult
},
"_token": "{{ csrf_token() }}",
type: "POST",
success: function(response){
console.info(response);
}
});
}
});
</script>
Обновлять :
+"took": 3
+"timed_out": false
+"_shards": {#1141 ▶}
+"hits": {#1309 ▼
+"total": 231
+"max_score": null
+"hits": array:10 [▼
0 => {#1191 ▼
+"_index": "products"
+"_type": "product"
+"_id": "1634"
+"_score": 5.7772136
+"_source": {#1214 ▼
+"category": "General 1234:0 - Dark Green 123:25"
Вскоре я могу разместить образец, но я собираюсь отобразить параметр списка данных.
Прохладный. Будучи на готове.
Хорошо, сейчас опубликовано
Это больше похоже на вывод dd(). Мне нужен вывод console.info(response).
Я ничего не понимаю, это то, что я получаю на вкладке сети в инструментах разработчика Chrome.
Есть ли выход для console.info(JSON.parse(response.hits.hits)) ...?
Я получаю «неожиданный токен o в JSON на позиции 1»
Без json. Разбирая, он вернул элементы объекта, как я и ожидал
Позвольте нам продолжить обсуждение в чате.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


После нашего чата замените обратный вызов success следующим:
<script>
success: function(response){
let searchResult = response.hits.hits;
for(let i = 0; i < searchResult.length; i++) {
$("#returnedProducts").append("<option value = " + searchResult[i]._source.category + ">" + searchResult[i]._source.category + "</option>");
}
}
</script>
Извините, по дороге домой, но я попробую это сделать, как только сяду за компьютер. Спасибо!
Итак, я наконец-то получил добавление для работы с помощью searchResult [i] ._ source.category. Еще раз спасибо!
Ой! Хороший. Мы это упустили. Разрешите отредактировать свой ответ. Ваше здоровье!
Спасибо! Значит, это не похоже на фильтрацию результатов? Это означает, что если я наберу букву, которая возвращает 10 результатов, и другую букву, которая возвращает только 5, в списке данных должны отображаться только самые новые 5, которые соответствуют полному вводу.
Фильтрация ваших результатов - это скорее проблема эластичного поиска. Можете ли вы подтвердить, что по мере ввода ajax отправляет запрос в PHP ... верно?
Да, это происходит при каждом нажатии клавиши. Таким образом, он возвращается правильно при событии, но список данных показывает все от каждого нажатия клавиши
Я чувствую, что почти у цели. Похоже, что сейчас отображаются только последние результаты, а не все возвращенные совпадения. Итак, консоль показала 5 результатов, но в списке данных появился только один.
Давайте посмотрим на образец вашего вывода и элемент html, в котором вы собираетесь отобразить результат.