Мне было интересно, как получить автозаполнение, работающее в моем тестовом приложении. Я разрабатываю Laravel 4, просто для практики. Поэтому я просто нашел его в google и нашел this library, а jQuery - единственная его зависимость.Как правильно обрабатывать запрос ajax
Я не эксперт по JavaScript и jQuery, и я ничего не знаю о AJAX, я просто сделал то, что в руководстве сказал и с некоторым здравым смыслом понял, как он работает в целом.
Вот код JavaScript, который применяет операцию автозавершения:
$('#autocomplete').autocomplete({
serviceUrl: '/search',
onSelect: function(suggestion) {
$('#autocomplete-suggestions').html("<a href='users/" + suggestion.data + "'>" + suggestion.value + "</a>");
}
})
Я определил услуги в файле routes.php
, так как это очень мало:
Route::get('search', function() {
$users = User::all();
$response = array(
"suggestions" => array()
);
foreach ($users as $user) {
array_push($response["suggestions"], array("value" => $user->username, "data" => $user->id));
}
return Response::json($response);
});
Как это работает у меня интересно. Я имею в виду, что каждый раз, когда пользователь вводит символ в поле ввода, выполняется запрос и выполняется служба, которая находится в методе маршрутов. Это подразумевает извлечение всех пользователей из базы данных, хранение их в массиве и последующее копирование их снова в новый массив, чтобы он соответствовал ожидаемому вводу. И затем, на этом json фактический поиск сделан.
Это кажется мне очень неэффективным, поскольку эта операция имеет стоимость и выполняется с большой частотой. Было бы лучше, если бы поиск был выполнен как запрос к базе данных, а не объект-объект для нескольких копий (потенциально) большого количества данных.
Кроме того, я высеваю несколько новых пользователей с этой частью коды:
for ($i = 0; $i<1000; $i++) {
$user = new User;
$user->username = 'username' . $i;
// assign the rest of the attributes
$user->save();
}
И казалось, что поиск не был сделан правильно. Я думаю, это другая проблема, касающаяся самой библиотеки автозаполнения.
Итак, поскольку я не знаком с AJAX, я просто хочу знать, является ли это обычным способом работы, или если это действительно ужасная идея, как я думаю. Каким будет правильный способ сделать это?
Я думаю, что вы правы. Ваш обработчик маршрута поиска должен фильтровать пользователей на основе предложения и возвращать только рекомендуемых пользователей. То, как вы его построили сейчас, неэффективно, и я был бы удивлен, если бы он фактически фильтровал. Обычно для каждого изменения делается новый запрос. – GolezTrol
Что сказал @GolezTrol, с дополнительным комментарием, который вы можете (и, возможно, должны) кэшировать результаты. Это «облегчит нагрузку» на сервере, так как он может проверять кеш для результатов поиска, а не ударять по базе данных снова и снова. – Kryten