cakephp,jquery,.ajax(),dataType:json
是否可以在没有cakephp控制器function的情况下进行操作? 我试图让我的服务器返回一个不是字符串的数据类型 – 而是一个数组
我的控制器function:
function test() { $this->layout = 'plain'; $task['Numbers']['uno'] = 'mooo'; $task['Numbers']['dos'] = 'says the cow'; $result = json_encode($task); $this->set('result', $result); }
我的视图文件test.ctp
echo $result;
echo $result;
我的jquery:
$('#test').live('click', test); function test() { var data = $('#form').serialize(); $.ajax({ type: "post", url: "/controller/test", data: data, dataType: 'json', success: function(response){ alert(response.Numbers.uno); } }); }
点击标记为test的html元素并没有给我任何东西。 但如果我拿出来
dataType: 'json',
并改变
alert(response.Numbers.uno);
至
alert(response);
在我的jquery中 – 我得到一个警告:json编码的数据,但作为一个字符串(
alert(typeof response);
)
有没有人知道可能会发生什么?
首先,回答你的问题,是的,你可以在没有视图的情况下做到(这是一个很好的理由)。 在你的控制器动作( test
,在这种情况下),只需设置$this->autoRender = false;
。 这就是我通常做的事情,只是在控制器本身中回显编码的JSON字符串。 这种方式不那么杂乱。
接下来我要看的是config.php
中的调试设置。 如果没有设置为0,那么很有可能这是你的问题。 您的echo语句可能会回显JSON格式的字符串,但会向其附加调试输出。 在该方法中,只包括Configure::write ( 'debug', 0 )
。 这将仅禁用当前请求的调试。 我通常在我的AppController中实际执行此操作:
if ( $this->RequestHandler->isAjax() ) { Configure::write ( 'debug', 0 ); }
我会使用像Firebug这样的工具,看看你的ajax请求发生了什么。 它将监视这些请求并提供请求和响应标头供您检查。 这可能有所帮助。 如果后者是问题,那么Firebug会在响应头中向您显示。
我同意Rob,除了在app控制器中设置调试。 这对我来说有点烦人,因为每次要为特定function调试某些东西时,都必须在app控制器中设置调试级别。 我在我正在工作的控制器中写出我的处理程序。
Configure::write('debug', 0); $this->autoRender = false;
我同意使用萤火虫。 使用firebug所有你需要做的就是打开firebug,点击控制台,然后运行你的测试。 这将告诉您使用jquery执行的操作并为您提供结果。
查看关于请求处理的cakePHP书籍:
http://book.cakephp.org/view/174/Request-Handling
CakePHP具有一些内置function来处理返回json的控制器方法。
您必须在使用之前转换数据。
看到这个答案:
用json响应jQuery ajax请求,怎么样?
你必须使用
var json = $.parseJSON(response); alert(json.Numbers.uno);
我只是用
die(json_encode(array('success' => true, 'result' => $result)));
在被叫控制器方法的最后,它适用于我。