0

我试图在我的程序中实现动态自动完成。第一次输入后它工作得很好。但它没有显示第一次尝试的建议。但是,服务器正在响应自动完成所需的源。这是我的代码。

       $('.autocomplete').live('keyup', function(){
        $this = $(this);
        var search = $this.val();
        $.ajax({
            url:'/package/index/search/keyword/'+search+'/format/json',
            async: false,
            success: function(res){
                //console.log(res.options);
                //console.log(res.defined_ids);
                staticObject = res.defined_ids;
                $this.autocomplete({
                    source: res.options
                });
            }
        });            
    });

服务器端代码是

    $keyword = $this->_getParam('keyword');
    $elementDetailModel = new Package_Model_ElementDetail();
    $arr = $elementDetailModel->searchElementDetail($keyword);
    $this->view->options = $arr['options']; // returns in the format array("test2","my new test", "night stay in delux room")
    $this->view->defined_ids = $arr['defined_ids']; // returns in the format array(21::21=>"test2", 22::22=>"my new test", 24::24=>"night stay in delux room")

当我在 firebug 中控制台记录 defined_ids 和选项时,当我在文本字段中输入“t”时,我得到了以下响应。
选项:

["test2", "我的新测试", "晚上住豪华房"]

定义ID:

Object { 21::21="test2", 22::22="my new test", 24::24="晚上住豪华房"}

任何帮助都是不言而喻的。提前致谢。

4

2 回答 2

0

萤火虫显示的格式不是 JSON 格式。它是一个数组,使用索引访问。

显示输出时,请确保json_encode()先显示数组,然后再显示。

例如,关于这个问题,你最终的数组应该是这样的

$array['options'] = array("test2", "my new test", "night stay in room");
//Then you should echo the encoded the array to json

echo json_encode($array);

接下来,请确保您的视图已关闭此请求。

于 2012-04-15T10:29:24.583 回答
0

您可能忘记指定上下文服务器端。在控制器的_init()方法中,添加:

$ajaxContext = $this->_helper->getHelper('AjaxContext');
$ajaxContext->addActionContext('actionName', 'json')
            ->initContext();

并确保actionName用您的动作控制器名称替换。

然后,$this->view->options = $arr['options']将自动转换为有效的 json 格式。

手册中有关 AjaxContext 的更多信息。

于 2012-04-15T17:32:10.623 回答