【发布时间】:2014-07-19 05:14:48
【问题描述】:
我很好奇如何在我使用 Laravel 4 开发的测试应用程序中实现自动完成功能,只是为了练习。于是我google了一下,发现this library,唯一的依赖就是jQuery。
我不是 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 所说的内容,以及您可以(并且可以说应该)缓存结果的附加评论。这将“减轻服务器的负载”,因为它可以检查缓存中的搜索结果,而不是一遍又一遍地访问数据库。
标签: php jquery ajax laravel autocomplete