我很好奇如何在我的测试应用程序中使用自动完成工作,我正在使用Laravel 4进行开发,仅供练习。所以我只是搜索它,发现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);
});
这工作让我疑惑的方式。我的意思是,每当用户在输入框中键入一个字符时,就会发出一个请求并执行服务,该服务位于routes方法中。这意味着从数据库中检索所有用户,将它们存储在一个数组中,然后将其全部复制到一个新数组中,以便根据预期的输入进行调整。然后,在那个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