我基本上构建了一个常见的自动完成搜索栏,假设用户写了一些东西,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()文档所说的。
有什么问题? :(
答案 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脚本中只缺少这两行,以便一切正常。
过度和完全。