0

我有一个输入字段,我正在变成一个 jqueryUI 自动完成:

$( "#autocomplete" ).autocomplete({
    autoFocus: true,
    source: mylist
 });

mylist 变量只是一个数组格式的字符串['Value1','Value2,'Blah'],我最初只是硬编码到脚本中。

现在我希望 mylist 变量成为我的 cakephp 应用程序中对函数的 ajax 调用的结果。函数基本如下,就是把所有的数据抓取成一个list,json编码。

public function source() {
    $this->layout = 'ajax';
    $countries=$this->Country->find('list',array('fields'=>'Country.country'));
    ChromePhp::log($countries);
    echo json_encode($countries);
}

这输出:

{"1":"Afghanistan","2":"Albania ","3":"Algeria ","5.. 

我的问题是将这个函数的输出(最终在 ajax 成功回调中作为“数据”)转换为正确的格式,以放入自动完成的选项数组中。

我可以在控制台记录每个值,但我很难过。基本上以正确的语法抓住稻草。

$.ajax({
    type: "GET",
    dataType: "json",
    url: "/source/",
    success: function(data){
        /*
        magic array string creation code would go here instead of my code below...
        */
        $.each(data, function(i, item) {
            console.log(item);
        });
        console.log('data',data);


    }
})
4

1 回答 1

2

如果您以正确的格式为其提供内容,自动完成插件可以为您完成很多工作。

我首先将变量重新索引为$countries从 0 开始。您可以使用该array_values()函数:

echo json_encode(array_values($countries));

这应该为您提供以下格式的 JSON:

['Afghanistan','Albania','Algeria',...]

然后,您可以将自动完成代码中的源属性更改为源操作的 url。

$( "#autocomplete" ).autocomplete({
    autoFocus: true,
    source: "/your_controller/source"
});

自动完成插件不会为您过滤结果,而是将查询字符串添加到带有term字段(例如 /your_controller/source?term=foo)的 url,因此您需要修改find()方法以使用它。

$countries = $this->Country->find('list', array(
    'fields' => 'Country.country',
    'conditions' => array(
        'Country.country LIKE' => $this->request->query['term'] . '%'
    )
));

您可以在API 文档的自动完成中阅读有关该source选项可以接受的不同类型的更多信息。

于 2012-11-06T16:48:47.040 回答