2009-10-23 107 views
0

我正在尝试编写一个简单的JSON文章,并且无论我做什么,回调警报都不会显示出来。我用萤火虫看帖子是否得到任何回应,并且“SHOE”回来。那么为什么警报不在回调中工作?Jquery JSON Ajax回调不工作 - CakePHP

视图代码:

$('#GaragePartAddfrompartlistForm').click(function() { 
     var item = "CHEESE"; 
    $.post("garage_parts/getlastid", { 'item' : item }, 
    function(data){ 
    alert(data.result); 
    }, "json"); 
    }); 

控制器代码:

function getlastid() { 
    $newid = "SHOE"; 
     $array = array('result' => $newid); 
     echo json_encode($array); 
    } 
+0

你能分享你的通话回应吗? – Sinan 2009-10-24 00:14:50

回答

1

你应该尝试设置HTTP标头与所述响应:

header("Content-type: application/json") 

header("Content-type: text/plain") 

jQuery可能不会处理您的响应,因为它没有得到预期的类型。然后

你的响应代码是:

function getlastid() { 
    header("Content-type: text/plain"); 
    $newid = "SHOE"; 
    $array = array('result' => $newid); 
    echo json_encode($array); 
} 

希望这有助于!

0

不要忘记为Ajax响应设置空的布局:

function getlastid() { 
    $this->layout = 'ajax'; 
    ... 
0

我不是太熟悉的蛋糕,但我用笨(类似于)...

一件事我已经注意到像这样的框架,是当你发出一个使用echo json_encode($array)的json响应时,你必须立即在下一行输入exit();。其他方面,框架发送标题指示html MIME类型。

可以是蛋糕太大的情况下,在任何情况下,它是值得一试...

3

确保您在beforeFilter调试设置为0,使用RequestHandler组件来检查它是否是一个Ajax请求。

使用RequestHandler

var $components = array(..., 'RequestHandler', ...); 

组调试为0;如果它是一个Ajax请求

function beforeFilter() 
{ 
    if ($this->RequestHandler->isAjax()) { 
     Configure::write('debug', 0); 
    } 
} 

,并在你的函数

function getlastid() 
{ 
    $this->autoRender = false; 
    $this->autoLayout = false; 

    $newid = "SHOE"; 
    $response = array('result' => $newid); 

    $this->header('Content-Type: application/json'); 
    echo json_encode($response); 
    return; 
} 

如果回声JSON和不设置调试为0,cake会在最后加上执行时间,并且不会成为有效的json响应,从而阻止jQuery正常工作 阅读。

作为一个额外的,通常我设置了一些更多的东西在$回应,所以我可以更好地处理它。

function getLastId() 
{ 
    ... 
    $response = array('success' => false); 

    ... code ... 
    if ($my_code_is_good) { 
     $response['success'] = true; 
     $response['data'] = $my_code_result; 
    } 

    ... 
} 

希望这有助于

+0

嗨, 所以我注意到,如果我将类型从“json”更改为“JSON”,它会打印警报。但是,如果我尝试在警报中打印data.result,则警报会打印“未定义”。如果我打印数据,警报以“{”结果“:”SHOE“}”响应。这很奇怪......为什么JSON无法正常工作? – 2009-10-24 03:43:59

+0

您是否使用过Firebug来查看服务器的响应情况?问题是jQuery没有将响应检测为json,因此,如果你只是提醒“数据”,它会显示一个字符串,如果你尝试访问一个属性,比如“data.result”,因为它是一个字符串,你得到undefined – Leite 2009-10-24 04:05:06

+0

我如何让jquery检测响应为json? – 2009-10-24 04:14:17

0

我发现与我的symfony/PHP应用程序,没有HTML字符普通文本响应(使用空或“JSON”的dataType)将触发成功回调。但是,如果服务器不输出除标题外的任何内容,则不会调用成功回调(我会考虑一个错误)。此外,如果服务器响应包含HTML字符(<>等),除非上下文类型显式设置为text/html,否则不会调用回调。这也消除了烦人的< pre>标签被jQuery错误地添加,以及阻止jQuery将响应转换为HTML实体(& lt; & gt;等等)。