我有一个单页应用程序,页眉,页脚和顶部导航是静态的,"页面"用Ajax打开。
示例:
主导航中的元素:
<a href="javascript:;" data-open-dynamic="/project/controllerName/actionName/">Something</a>
JavaScript的:
$('body').on('click', '[data-open-dynamic]', function () {
var url = $(this).data('openDynamic');
openDynamic(url);
})
function openDynamic(url)
{
$.ajax({
url: url,
async: true,
success: function (data) {
//some other logic
$('.content').html(data).fadeIn();
}
})
}
问题是我还需要从直接URL打开这些页面。现在,如果我尝试打开domain.com/controllerName/actionName
,设计就会被破坏,因为控制器中的布局设置为ajax
:
public function initialize()
{
parent::initialize();
$this->layout = 'ajax';
}
我尝试使用beforeFilter()
,beforeRender()
,shutdown()
做一些事情,但似乎包含方法openDynamic()
的JavaScript文件尚未加载,我可以&#39;叫它。
public function beforeRender(\Cake\Event\Event $event)
{
parent::beforeRender($event);
$url = $event->subject->request->here; // the URL is correct
echo 'openDynamic("' . $url . '");';
$this->response->stop();
}
此外,我不确定是否会以这种方式正确加载页眉,页脚和导航。我怎样才能做到这一点?
答案 0 :(得分:1)
如果通过AJAX请求页面,只将布局设置为ajax
怎么样?您可以使用$this->request->is('ajax')
: -
public function beforeRender(\Cake\Event\Event $event)
{
parent::beforeRender($event);
if ($this->request->is('ajax')) {
$this->layout = 'ajax';
}
}
这比在代码中混合JavaScript和PHP更简洁。