我有一个方法会根据请求类型呈现标准视图文件index.ctp
或AJAX视图文件index_ajax.ctp
在我的控制器中 - 我有以下代码
public function index() {
if ($this->request->is(array('get', 'post))) {
// .... do normal stuff
} elseif ($this->request->is('ajax')) {
$this->autorender = false;
echo 'blah blah'; // this shows
$this->render('index_ajax', 'ajax'); // this does not render
exit;
}
}
调用此AJAX视图的Javascript如下所示
$('#myModal').on('show.bs.modal', function (event) {
$.ajax({
url: '/cake/myController/index',
type: 'ajax',
success: function(data) {
alert(data);
$('#link-list').html(data);
}
});
});
现在普通的索引视图渲染得很好 - 根本没有问题,但是AJAX视图没有渲染。如果我在控制器中放置一个echo语句,那么该语句会输出到视图,但实际的视图文件本身不会被拾取和渲染。我不确定我的错误是什么 - 感谢任何帮助。
答案 0 :(得分:1)
试试这个:
if ($this->request->is(array('get', 'post'))) {
// .... do normal stuff
} elseif ($this->request->is('ajax')) {
$this->view="index_ajax";
$this->layout="ajax";
}
在此之后,如果您使用块或类似的东西,不要显示您的代码或类似内容,请查看您的布局ajax。
答案 1 :(得分:1)
好的 - 经过大量的反复试验和试验后,我找到了解决方案。
对于我发布的原始问题,@ mark给出了正确的答案,然后我将可用的插件here合并 - 实际上,我们下载并包含该链接和AJAX方法中提到的插件我们的控制器我们在下面添加了一行
$this->viewClass = 'Tool.Ajax'
在你的AJAX javascript中包含以下行,它从解析的JSON数组中提取内容并嵌入提供的HTML选择器中
$.ajax ({
url: '/myajaxurl',
type: 'ajax',
success: function(data) {
$('myDiv').html(data.content);
}
});
足底!现在可以呈现AJAX视图了。我检查了插件源代码,发现Mark基本上扩展了Basic视图类并重写了render方法,以通过JSON数组呈现AJAX视图。然而,这对我来说是一个问题,因为我在我的AJAX视图中也有分页。因此,虽然链接将被渲染得很好并且第一页可以正常加载,但第二页和后续页面将作为未解析的JSON数组加载。
为了解决这个问题,我不得不做了很多摆弄,我终于弄清楚我们需要放弃CakePHP手册中指定的默认AJAX分页,并使用Mark提供的AJAX分页link(沿着适当的source code)。基本上,我们现在应该使用echo $this->Pagination->numbers()
而不是使用默认的echo $this->element('Tools.pagination')
,我们应该包含一个javascript,它以下列方式绑定生成的分页链接 -
假设分页链接位于标识为“分页”的div中,并且这些链接是由Mark的插件动态生成的
$(document).on('click', 'div.pagination a', function(evt) {
evt.preventDefault();
$('#myDiv').load($(this).attr('href'), function(data) {
var res = $.parseJSON(data);
$('#myDiv').html(content);
});
});
基本上,上面发生的是我们将每个分页链接与不同的事件绑定,而不是CakePHP自动生成的事件。所以我们通过load
方法加载超链接的内容,但由于AJAX视图返回了JSON数组,我们正在解析它并相应地设置DIV的内容。
希望这有助于其他人下线!