1

我正在使用 symfony sfFormExtra 插件附带的 jquery 自动完成插件。

/*
* jQuery Autocomplete plugin 1.1
*
* Copyright (c) 2009 Jörn Zaefferer
*
* Dual licensed under the MIT and GPL licenses:
*   http://www.opensource.org/licenses/mit-license.php
*   http://www.gnu.org/licenses/gpl.html
*
* Revision: $Id: jquery.autocomplete.js 15 2009-08-22 10:30:27Z joern.zaefferer $
*/

它似乎确实根据键对 json 结果进行了排序,但我在代码中找不到任何关于排序选项的提及。

我希望将结果排序为从服务器返回的结果。

结果是这样构建的

public function doMemberSelectForSelectById($q, $limit){

    $query = $this->retrieveMemberOrganisations($this->createUnrestrictedQuery('o'))->
      andWhere("o.name like '%".$q."%'")->
      orderBy("o.name")->
      limit(intval($limit));

    $org_data = $query->execute();
    $orgs = array();
    foreach ($org_data as $org){
        $orgs[$org->getId()] = $org->getName();
    }
    return $orgs;
}

$orgs = Doctrine_Core::getTable('Organisation')->
    doMemberSelectForSelectById($request->getParameter('q'), $request->getParameter('limit'));
echo $this->renderText(json_encode($orgs));
    }
return sfView::NONE;

Chrome 开发工具中的结果是(按名称排序)

{
    "1781": "1st Mechanical \/ 1st Maintenance",
    "1771": "Acco Building Ltd",
    "203": "Active Welding Limited",
    "443": "Aircon Commissioning & Services Ltd",
    "588": "Akon Electrical Engineering Limited",
    "625": "Alaska Interiors Ltd",
    "796": "Alutech Windows & Doors Ltd",
    "584": "Arrow International Ltd"....
}

触发它的javascript在这里

jQuery(document).ready(function() {

    jQuery("#autocomplete_rsvpCompany1").focus(function({
         jQuery(this).val('');});
             jQuery("#autocomplete_rsvpCompany1").autocomplete(
                 'http://www.nzgbc.org.nz/index.php?option=com_nzgbc_member&uri=%2Forganisation%2FjsonListMember%2Faction',
                 jQuery.extend({}, {
                     dataType: 'json',
                     minChars: 0,
                     delay:0,
             max:700,
                     scroll: true, 
                     parse: function(data) {
                 var parsed = [];
                 for (key in data) {
                             parsed[parsed.length] = { data: [ data[key], key ], value: data[key], result: data[key] };
                 }
                 return parsed;
                 }
         }, { })
        ).result(function(event, data) {
            jQuery('#rsvpCompany1').val(data[1]);
        });

我怎样才能做到这一点?

4

1 回答 1

1

您应该按如下方式更改“解析”方法:

parse: function(data) {
  var parsed = [];
  for (key in data) {
    parsed[parsed.length] = { 
      data: [ data[key], key ], 
      value: data[key], 
      result: data[key] 
    };
  }
  parsed.sort(function (a, b){
    var aKey = a.value;
    var bKey = b.value;
    return ((aKey < bKey) ? -1 : ((aKey > bKey) ? 1 : 0));
  });
  return parsed;
}

问题是“数据”数组有一个数字键,因此当您在“for”循环中循环遍历“数据”元素时,您将按数字顺序将元素添加到“解析”数组中(例如: 203、443、584、588 等),因此在将所有元素添加到“已解析”数组后,您必须按“数据 [键]”而不是“键”对其进行排序。

于 2012-09-13T07:19:25.950 回答