2014-07-18 105 views
0

我很好奇如何在我的测试应用程序中使用自动完成工作,我正在使用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不熟悉,我只想知道这是否是常用的操作方式,或者如果我认为这确实是一个可怕的想法。什么是正确的方法来做到这一点?

+0

我认为你是对的。您的搜索路由处理程序应根据建议过滤用户,并仅返回建议的用户。您现在构建它的方式效率低下,如果实际过滤,我会感到惊讶。通常情况下,每次更改都会提出一个新请求 – GolezTrol

+0

@GolezTrol说了些什么,以及您可以(也可以说应该)缓存结果的附加评论。这将会“减轻服务器负载”,因为它可以检查缓存中的搜索结果,而不是一遍又一遍地访问数据库。 – Kryten

回答

1

我应该返回所有用户与每个请求和搜索客户端?

绝对不是。当通过AJAX向您的服务器发出请求时,搜索查询将作为查询字符串参数提供。从自己的文件:

网页,对Ajax的自动完成功能提供的数据,在我们的例子 autocomplete.ashx将收到的查询字符串查询GET请求=李, 它必须按以下格式返回JSON数据

你可以从Laravel:$query = \Input::get('query');

你应该使用字符串您users表中搜索使用口才或者其他并返回只匹配建议。

每次击键都发出HTTP请求会很糟糕吗?

该库有一个选项deferRequestBy。当给定一个整数值(毫秒)时,它会等待很长时间,直到在keyUp事件上执行请求。如果另一个keyUp事件进入,它将取消第一个事件。这有助于减少您可能正在运行的并发请求的数量。

https://github.com/devbridge/jQuery-Autocomplete/blob/master/src/jquery.autocomplete.js#L384-L384

直接从他们的Readme on Github

deferRequestBy:毫秒数推迟Ajax请求。默认值:0

因此,要回答你的问题:

所以,因为我不熟悉AJAX,我只是想知道这是否是 操作通常的方式,如果此确实是一个可怕的想法,因为我想到了 。什么是正确的方法来做到这一点?

是的,如果您使用默认值0,它可能是一个可怕的想法。但它不一定是。

从你的问题其他景点:

  1. 你真的需要去DB并获得每次都用户。如何缓存?
+0

好的评论,但它并没有真正回答这个问题。 – GolezTrol

+0

关于使用缓存的好处。简单地使用'$ users = DB :: table('users') - >记住(10) - > get();'和deferRequestBy一起将会是一个很好的解决方案。只需要在集合中搜索正确的用户并返回即可。 – user3158900

+0

@GolezTrol他/她提出了多个观点,我试图回答所有问题。 –