Я придумал это аккуратное решение. Сначала вы создаете пространство имен для своих связующих в глобальной области видимости:
// Binder for PJAX init functions
$.fn.bindPJAX = {}; // Create namespace
function bindPJAX(functionName) {
// Check function existence, then call it
return $().bindPJAX[functionName] && $().bindPJAX[functionName]();
}
Затем привяжите обратный вызов к кликам PJAX:
$(document).ready(function(){
if ($.support.pjax) {
$('a[data-pjax]').on('click', function(event) {
var container = '#main';
var emptyRoute = 'feed'; // The function that will be called on domain's root
// Store current href without domain
var link = event.currentTarget.href.replace(/^.*\/\/[^\/]+\//, '');
var target = link === "" ? emptyRoute : link;
// Bind href-specific asynchronous initialization
$(document).on('ready pjax:success', container, function() {
bindPJAX(target); // Call initializers
$(document).off('ready pjax:success', container); // Unbind initialization
});
// PJAX-load the new content
$.pjax.click(event, {container: $(container)});
})
}
});
Когда это настроено, вы можете продолжить расширение объекта $.fn.bindPJAX
, чтобы добавить функции, которые будут соответствовать вашему имени маршрута. Например, это в глобальной области будет вызываться при доступе к http://www.yourdomain.com/admin
через PJAX:
$.extend($.fn.bindPJAX, {
admin: function(){
// Initialization script for /admin route
}
});
Вам также следует учитывать жизнеспособный СУХОЙ запасной вариант, когда PJAX не работает или не поддерживается, например запуск правильной функции инициализации при первой загрузке страницы путем проверки window.location
в javascript, или, возможно, жесткое кодирование в представлениях вашего приложения.