2014-10-29 55 views
0

所以我想在输入上显示这个国家列表: 我使用JQuery UI自动完成和ajax调用数据库。jquery autocomplete&symfony2

的Javascript:

$("#fos_user_registration_form_country").autocomplete({ 
    minLength: 2, 
    scrollHeight: 220, 
     source: function(req, add){ 
     $.ajax({ 
      url:Routing.generate('user_register_countries_autocomplete'), 
      type:"get", 
      dataType: 'json', 
      data: 'title_search='+req.term, 
      async: true, 
      cache: true, 
      success: function(data){ 
       var suggestions = []; 
       //process response 
       $.each(data, function(i, val){ 
        suggestions.push({"name": val.countryName}); 
       }); 
       //pass array to callback 
       add(suggestions); 
      } 
     }); 
    } 
}); 

控制器:

public function AutoCompletePaysAction() 
{ 
    $repository = $this->getDoctrine()->getManager()->getRepository('MyAwesomeWebsiteHomeBundle:Countries'); 

    $listeCountries = $repository->countriesArray(); 
    $liste = json_encode($listeCountries); 

    return new Response($liste); 
} 

回购

public function countriesArray() 
    { 
     // $query = $this->createQueryBuilder('s'); 

     $query = $this->_em->createQuery("SELECT a.countryName FROM MyAwesomeWebsiteHomeBundle:Countries a"); 
     return $query->getArrayResult(); 
    } 

什么显示在Firebug(我的Ajax调用的响应=所有国家)

[{"countryName":"United States"},{"countryName":"Canada"},{"countryName":"Afghanistan"},{"countryName":"Albania"},... 


- > AJAX调用似乎每次我键入输入一个字母做工精细,但没有建议显示为它应该自动完成做。

对我来说,每次输入一个字母来检索相同的值就会发出一个ajax调用似乎很奇怪,但是在文档中它是如何完成的。此外,我试图预加载阵列,但我不能让它工作。 tldr:输了。

有什么建议吗?谢谢 !

+1

通常情况下,您将传递用户键入的任何内容作为查询参数。然后,服务器将根据参数筛选返回的条目。大概每输入一个字母都会导致更短的国家名单。因此,“怪异”的行为。自从我使用jquery自动完成之后,这已经太久了。其他人会希望指出你的配置不正确。它看起来好像你会希望你的动作返回一个JsonResponse对象。 – Cerad 2014-10-29 14:36:48

+0

事实上,通过简单的JsonResponse替换json_encode和Response似乎给了我一个选择列表。 (我看不到,只能看到列表中的小点)。比方说,这是一个开始 – oligan 2014-10-29 15:14:17

+1

我认为你可能需要在提供的源代码标签。 'suggestions.push({“label”:val.countryName});' – yajakass 2014-10-29 15:17:27

回答

2

您可以更改您的控制器以获取该术语。请记住,默认情况下,autocomplete需要包含单个项的数组。或与labelvalue键对象的数组。

public function AutoCompletePaysAction(Request $request) 
{ 
    $term = $request->get('term',null) 
    $repository = $this->getDoctrine()->getManager()->getRepository('MyAwesomeWebsiteHomeBundle:Countries'); 
    if($term){ 
     $countries = $repository->createQueryBuilder('c') 
      ->where("c.countryName LIKE '%:term%'") 
      ->setParameter('term', $term) 
      ->getQuery() 
      ->getResult(); 
    } 
    else{ 
     $countries = $repository->findAll(); 
    } 
    $list = array(); 
    foreach($countries as $country){ 
     array_push($list, array('label'=>$country->getCountryName(), 'value'=>$country->getCountryName()); 
    } 
    return new JsonResponse($list,200); 
} 
+0

不幸的是,我放弃了,把我所有的在一个HTML列表中的国家,我很惭愧,但有时候一个人必须做他应该做的事情。 感谢您的帮助。 无论如何,阿贾克斯呼叫有点太慢,没有兴趣,这是我的经验。 – oligan 2014-10-30 09:25:19

+0

在这种情况下,只需要做我所做的事情,并将js对象呈现给页面并将其用作数据源,以便显示搜索结果。 – Chausser 2014-10-30 23:11:08