2015-06-26 3 views
2

У меня есть одностраничное приложение, где верхний и нижний колонтитулы являются статическими, а «страницы» открываются с помощью Ajax.Вызов метода JavaScript перед рендерингом

Пример:

элемент из главной навигации:

<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() но, кажется, файл JavaScript, содержащий метод openDynamic() пока не загружен, и я не могу его назвать.

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(); 
} 

Также я не уверен, что верхний и нижний колонтитулы и навигационная система будут загружены должным образом таким образом. Как я могу это достичь?

ответ

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 в коде.

+1

Или используйте [** компонент обработчика запроса **] (http://book.cakephp.org/3.0/en/controllers/components/request-handling.html), который автоматически выполняет эти действия. – ndm

Смежные вопросы