使用jQuery的自动完成功能和PHP中的JSON对象

时间:2013-01-28 04:38:58

标签: jquery autocomplete json

我基本上构建了一个常见的自动完成搜索栏,假设用户写了一些东西,jQuery返回一个建议列表,用户选择一个。

我的 AJAX通话如下所示:

var response = '';
var request = $.ajax({
 url: "./includes/search_products.php",
 type: "post",
 dataType: "json",
 data: serializedData,
 success : function(text) {
    response = text; // Gets the list of suggestions
 }
});

响应是:

{"id":"2",
"companyId":"15",
"productTypeId":"1",
"label":"Alfa Romeo 159",
"price":"50000","comments":
"Random comment."}

我如何设置.autocomplete:

request.done(function (){
        console.log("Works.");
        $('#product_search').autocomplete({
            source: response,
            minLength: 1,
            select: function(event, ui) {
                alert("yey");
            }
        });
    });

我得到的错误消息是:

TypeError: this.source is not a function

我认为正常的响应应该有更少的引号,基于PHP json_encode()文档所说的。

有什么问题? :(

2 个答案:

答案 0 :(得分:1)

这不是一个明确的答案,但最有可能是这种情况。

你没有一个对象你有一个字符串..所以尝试这样做 获取后首先检查变量响应的类型 你可以用$.type(response)这样做 如果类型是字符串,则执行以下操作

response = JSON.parse(response);

这很可能是你的问题

答案 1 :(得分:0)

好的,我在2天后找到了解决方案。总之,我希望它能帮助某人。没有AJAX值得花8个小时发誓。这不是一个教程,但它涵盖了我为了获得工作版本而遇到的一些问题。

我使用json_encode将对象(比如Product)转换为JSON。 Product类还实现 JsonSerializable 接口,该接口由一个函数 jsonSerialize()组成。

我在原始帖子中对jsonSerialize()的实现时间较长,但我最终还是有这样的:

function jsonSerialize() {
    return [
        'id' => $this->id,
        'label' => $this->name
    ];
}

要使用自动完成功能来处理对象或实际上不只是一维数组,您需要具有'标签''值'字段。标签将显示为自动填充建议,但当您选择其中一个标签时,标签将显示在输入中。

这就是我的实际自动完成功能的外观:

$("#product_search").autocomplete({
    source: "./includes/search_products.php",
    minLength: 1,
    select: function(event, ui) {
        /* Do something */
    }
});

我的问题是我用json_encode($ product)返回了一个对象。我想说的是$ product = new Product(...)。看来自动完成功能的源选项需要一组产品,而不仅仅是一个产品。

<强>解决方案:

if(!is_array($product))
    $product = array($product);

我的代码在原帖中没有错,我的PHP脚本中只缺少这两行,以便一切正常。

过度和完全。