tôi đã đưa ra giải pháp gọn gàng này. Trước tiên, bạn bắt đầu bằng cách tạo ra một không gian tên cho chất kết dính của bạn trong phạm vi toàn cầu:
// Binder for PJAX init functions
$.fn.bindPJAX = {}; // Create namespace
function bindPJAX(functionName) {
// Check function existence, then call it
return $().bindPJAX[functionName] && $().bindPJAX[functionName]();
}
Sau đó ràng buộc một callback để PJAX nhấp chuột:
$(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)});
})
}
});
Khi điều này được thiết lập, bạn có thể tiến hành mở rộng $.fn.bindPJAX
để thêm các hàm phù hợp với tên tuyến đường của bạn. Ví dụ, điều này, trong phạm vi toàn cầu, sẽ được gọi khi truy cập vào http://www.yourdomain.com/admin
qua PJAX:
$.extend($.fn.bindPJAX, {
admin: function(){
// Initialization script for /admin route
}
});
Bạn cũng nên xem xét một dự phòng DRY khả thi khi PJAX thất bại hoặc không được hỗ trợ, như tung ra hàm init đúng trên tải trang đầu tiên bằng cách kiểm tra window.location
bằng javascript hoặc có thể mã hóa nó trong lượt xem của ứng dụng của bạn.
Nguồn
2013-02-18 08:29:45
Cảm ơn vì điều này! – neersighted
Loool. thích nó :) – Zeck
Tôi có thể làm gì nếu mã khởi tạo khác với mỗi trang? – shreyj