首先,我正在构建一个运行Ajax的完整CRM,并且有很多内容,所以请耐心等待并阅读整个内容。
我有一个返回几个json数组的ajax脚本。当我从我的php脚本中显示返回值时,我得到了这个:
[{"packages":{"id":"1","name":"Land Line"}},{"packages":{"id":"2","name":"Cellular w\/Alarm.com"}},{"packages":{"id":"3","name":"Home Automation"}}]
我要做的是分离数组,以便我可以从中选择一个选择。在任何人说什么之前,是的我知道如何做到这一点我自己,但我需要这个脚本填充的形式是一个选择下拉列表或完全填写表格基于进入另一个脚本的id。这有点令人困惑,所以请不要叮嘱我。
这是PHP脚本alliance_form.php:
$equip = "SELECT * FROM packages WHERE brand='$brand'";
if($db->query($equip) === false) {
trigger_error('Wrong SQL: ' . $query . ' Error: ' . $db->error, E_USER_ERROR);
} else {
$result = $db->query($equip);
$array = array();
foreach($result as $r) {
$array[] = array(
"packages" => array(
"id" => $r['id'],
"name" => $r['name']
)
);
}
echo json_encode($array);
}
这是jquery转到PHP表单并返回输入信息:
$.ajax({
type: "POST",
url: "/crm/alliance_form.php",
data: dataString,
success: function(msg)
{
$("#package-form").html(msg);
$.each(msg.packages, function(i, object) {
$.each(object, function(index, value) {
alert(value);
});
});
},
error: function(error)
{
$(".error").html(error);
}
});
这是CRM订购系统的一部分,因此该脚本正在检查数据库中ID下的现有订单。如果id在那里,那么它应该返回订单信息并填充表单。如果没有,它将给出一个选择下拉列表来选择一个包,然后填充一个空表单。这就是我现在所掌握的要点。
这是一个问题:为什么我不能在每个()循环上得到JQuery的响应。一个返回带有一个常规数组,这个是一个嵌套数组。
答案 0 :(得分:1)
我不太清楚你在问什么,但这是我对此的想法:
你有.packages
在错误的地方。而不是:
$.each(msg.packages, function(i, object) {
$.each(object, function(index, value) {
...
你应该写下这个:
$.each(msg, function(i, object) {
$.each(object.packages, function(index, value) {
...
更好的是,你可以完全摆脱packages
。这是JSON结构中不必要的级别。
另外,我不认为jQuery知道响应是JSON。为此,您需要dataType: 'json'
的参数列表中的$.ajax
或服务器上的某些内容来适当地设置MIME类型。
我也关注$("#package-form").html(msg);
,因为msg
不是HTML字符串。
答案 1 :(得分:0)
你应该尝试这样的事情(Example)
msg = $.parseJSON(msg); // parse JS to object
$.each(msg, function(i, object) {
$.each(object.packages, function(index, value) {
console.log(value);
});
});
而不是$.each(msg.packages, function(i, object){...})
,因为msg
是一个对象数组,在您的给定示例中,现在有三个对象,每个对象都有一个packages
项(嵌套对象),其中包含{ {1}}和id
。
更新:您也可以使用一个循环(Example)
name
答案 2 :(得分:0)
无论如何,我尝试了你提供的两种解决方案,而且我已经看了一段时间,但都没有奏效。我将此更新为:
$("#brand").click(function () {
var brand = $(this).attr('rel');
$("#order-form").empty();
var contact_id = $("#contact_id").val();
var dataString = "contact_id=" + contact_id +"&brand=" + brand + "";
//alert("test");
$.ajax({
type: "POST",
url: "/crm/alliance_form.php",
data: dataString,
//dataType: "json",
success: function(msg)
{
//$("#package-form").html(msg);
$.each(msg, function(i, object) {
if(msg.packages) {
$("#package-form").append("<select>");
$.each(object.packages, function(index, value) {
$("#package-form").append('<option value="'+value+'">'+index+'</option>');
});
$("#package-form").append('</select>');
}
});
},
error: function(error)
{
$(".error").html(error);
}
});
});
这甚至不会返回任何空白的选择框。 $("#package-form").html(msg);
就是这样我可以看到PHP脚本将其发回的输出。 if语句只是运行验证以查看该数组是否具有包含其中包的嵌套数组。我需要return函数来执行某个操作。非常重要!
对于ajax中的dataType: 'json',
行,如果我放入了它,它就不会给我一个返回值。但当我删除它时,它将显示数组。
除了像建议一样移动查询外,PHP文件中没有任何更改。
答案 3 :(得分:0)
好的伙计们。我得到了答案!我喜欢这样:
$("#brand").click(function () {
$("#order-form").empty();
$("#package-form").empty();
var msg = '[{"packages":{"1":"Land Line"}},{"packages":{"2":"Cellular w\/Alarm.com"}},{"packages":{"3":"Home Automation"}}]';
var newData = JSON.parse(msg);
var newSelect = "<select>";
$.each(newData, function(i, ob) {
$.each(ob.packages, function(index, value) {
newSelect += '<option value="'+index+'">'+value+'</option>';
});
});
newSelect += "</select>";
$("#package-form").append(""+newSelect+"");
});