1

我正在研究 extjs 4 项目。在这个项目中,我必须在jsphp文件之间进行通信。所以要从 js 调用 php,我使用的是 Ext.Ajax.request。

var dirs = [];

Ext.Ajax.request(
{
    url: 'text.php',
    method: 'GET',
    success: function(response) 
    {
        dirs = JSON.parse(response.responseText);

    },
    failure: function(response) 
    {
        alert('server-side failure with status code ' + response.status);
    }
});

// Creating dropdown list menu
document.write("<select class='select'>");
for (var i = 0; i < dirs.length; i++)
{
    document.write("<option>" + dirs[i] + "</option>");
}
document.write("</select>");

php代码如下:

<?php

$filepath = "scenarios";
$dirs = array();
$files = array();

$scenes = array_diff(scandir($filepath), array('..', '.'));

for ($i = 2; $i < count($scenes)+2; $i++)
{
    if (strpos($scenes[$i], '.'))
    {
        array_push($files, $scenes[$i]);
    }
    else
    {
        array_push($dirs, $scenes[$i]);
    }
}

if (count($dirs) > 0)
{
    echo json_encode($dirs);
}
else
{
    echo json_encode("You do nat have any projects. Please create new project.");
}   

?>

现在问题出现在我想从结果中生成列表菜单的部分dirs object。在 firebug DOM dirs = ["google","yahoo"],但在循环中,dirs.length 返回 0???

另外,当我放在alert(dirs.length)for 循环之前,它显示 0,然后正确生成列表菜单...奇怪????

4

2 回答 2

1

请求调用是异步的,这意味着在调用 Ext.Ajax.Request 之后,下一条指令就是您的循环。但是您还没有收到来自服务器的数据。您需要将循环放在成功回调中,以确保在从服务器获取数据后执行它。

var dirs = [];

Ext.Ajax.request(
{
    url: 'text.php',
    method: 'GET',
    success: function(response) 
    {
        dirs = JSON.parse(response.responseText);
        // Creating dropdown list menu
        document.write("<select class='select'>");
        for (var i = 0; i < dirs.length; i++)
        {
          document.write("<option>" + dirs[i] + "</option>");
        }
        document.write("</select>");

    },
    failure: function(response) 
    {
        alert('server-side failure with status code ' + response.status);
    }
});

此外,当我在 for 循环之前放置 alert(dirs.length) 时,它显示 0,然后正确生成列表菜单...奇怪????

这是因为在alert您单击“确定”之前会停止程序的执行流程。在此期间,数据可能来自服务器,dir变量中填充了它们。

于 2013-06-14T23:41:04.577 回答
0

我看不到任何标题被发送 - 大多数浏览器都需要:

header('content-type: application/json; charset=utf8;');
if(sizeof($dirs) > 0){
   echo json_encode(array('success' => true, 'data' => $dirs));
}
else {
   echo json_encode(array('success' => false, 'error' => 'You do not have any projects.' ));
} 

JavaScript:

var xhr = new Ext.data.Connection();
xhr.request({
   url: '/text.php',
   method: 'GET',
   headers: {'Accept':'application/json'},
   success: function(response, opts) {
      var obj=Ext.decode(response.responseText);
      var html='';
      Ext.each(obj.data, function(v,i){html+='<option>'+v+'</option>';});
      html='<select>'+html+'</select>';
      console.info(html);
   }
});

HTML 生成必须驻留在回调函数中 - 否则根本没有意义。

在没有看到返回的 JSON 的情况下 - 很难判断它有什么问题。

在不发表评论的情况下投票否决为什么真的很蹩脚。

于 2013-06-15T03:03:59.070 回答