0

我基本上是在构建一个通用的自动完成搜索栏,假设用户在其中写一些东西,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() 文档所说的,我认为正常的响应应该有更少的引号。

有什么问题?:(

4

2 回答 2

1

这不是一个明确的答案,但很可能是这种情况..

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

response = JSON.parse(response);

这很可能是你的问题

于 2013-01-28T04:56:02.890 回答
0

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

我正在使用 json_encode 将对象(比如产品)转换为 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 脚本中缺少这两行。

完了,走吧。

于 2013-01-31T01:11:37.267 回答