【发布时间】:2012-11-08 22:44:26
【问题描述】:
我有这个 ajax 请求,每当我更改输入字段时都会调用它:
$(document).ready(function(){
$('#PostTitle').change(function(){
var inputstring=$("#PostTitle").val();
submitData(inputstring);
});
});
function submitData(inputstring){
$.ajax({
type: 'POST',
url: '/myWebsite/posts/set_post_images',
data: inputstring,
dataType: "text",
success:function(data){
$("#selectImage").replaceWith($('#selectImage', $(data)));
},
error:function(){
$('#selectImage').html("You failed misserably.");
},
timeout: 5000
});
}
以上代码在 add.ctp 文件(Posts 控制器的视图)中。调用的函数 set_post_images 位于 Posts Controller 本身中,如下所示:
public function set_post_images($url = null) {
if($url!=null){
$this->set('imageArray', $this->getImages($url));
} else {
$this->set('imageArray', array("/img/someImage.png"));
}
if ($this->RequestHandler->isAjax()) {
$this->autoRender = false;
$this->layout = 'ajax';
$this->render('/elements/selectImageElement');
}
return;
}
我要做的是从 selectImage div 中获取现有元素,替换为新元素。问题是,ajax 不断返回 add.ctp 文件(调用请求的文件)的全部内容。
这可能是什么原因,我该如何解决?
编辑:已解决
$this->Auth->allow(array('set_post_images'));没有设置,所以响应返回整个页面。修复后,可以对操作进行对话。
另外,在控制器中,变量不是通过 $url 而是通过 $this->data['url'] 访问的。
编码愉快!
【问题讨论】:
-
使用浏览器的开发者工具查看请求的样子。请求正文在这里似乎无关紧要,但 URL 可能很重要。我知道您已经在代码中设置了 URL,但最好查看浏览器实际请求的位置。从那里开始,逐步执行您的操作逻辑。
isAjax()是真的吗?如果不使用 RequestHandler,Recent Cake 就会有类似$this->request->is('ajax')的语句。最后,在浏览器中检查服务器响应。服务器返回整个add.ctp视图,还是您的replaceWith代码出错? -
你好,本。请求对我来说看起来不错:
Request URL:http://localhost/CheckMates/posts/set_post_images Request Method:POST Status Code:200 OK请求标头包含这个,看起来也不错:Host:localhost Origin:http://localhost Referer:http://localhost/CheckMates/posts/add我不确定如何验证控制器操作本身,因为调试根本没有显示任何东西(可能是正常的在这种情况下?)。响应是整个 add.ctp,浏览器开发工具显示它,如果我用 alert(data) 输出数据,它会显示整个代码... -
哦,另外,在检查请求之前,我用您的代码替换了 RequestHandler。
-
删除 AJAX 检查。当您使用浏览器查看它时,让该操作正常工作。使用
alert()进行调试或检查响应体并不有趣。一切就绪后,使用 AJAX 将其重新连接到前端。 -
好吧,我现在觉得有点傻......我的代码中有两件事是关闭的。最重要的是 $this->Auth->allow 不包含 set_post_images 操作,因此根本无法访问它。当我尝试手动访问该操作时,我在您发表评论后注意到了这一点。第二个是我什至没有使用请求传递的参数。现在,我在控制器操作中将 $url 替换为 $this->data['url'] ,一切正常。非常感谢!