Я сделал простую функцию загрузки содержимого прокрутки, основанный на primefaces DataTable:Javascript ждать запроса экстерном АЯКС
PF('tableWidget').jq.bind("scrollstop", function() {
var t = PF('tableWidget');
if(t.jq.scrollTop() + t.jq.height() >= t.jq.children().height()) {
var rows = t.jq.find('tr'); //save current rows
$.ajaxSetup({async: false}); //ajax set sync
t.paginator.setPage(t.paginator.cfg.page + 1); //framework pagination function with an ajax call inside (and other stuff) to get new rows
rows.prependTo(t.jq.find('tbody')); //AFTER pagination, add old rows
$.ajaxSetup({async: true}); //ajax set async again
}
});
Объяснение: Когда пользователь прокручивает вниз к нижней части DataTable, я просто использовать пагинацию , но сохраните старые строки раньше. Закончив разбивку на страницы, я снова добавляю строки. Это приводит к загрузке супер классной прокрутки, где только новые данные должны быть загружены с сервера, а не старое содержимое снова.
Но, как я читал в других вопросах, использование синхронных вызовов ajax - это плохая практика.
Непросто переопределить функцию «t.paginator.setPage (x)», потому что в этой функции есть где-нибудь вызов ajax.
Есть ли способ обернуть эту целую функцию и добавить к ней некоторый успешный обратный вызов, не копаясь до реального базового вызова ajax?
Большое спасибо!
Спасибо за этот ответ, но здесь вы переопределяете функцию setPage. Он уже реализован в среде с множеством различных вызовов функций, одним из которых является вызов ajax. Невозможно ли обернуть функцию setPage и получить событие вызова ajax? Скажем, с некоторой привязкой или чем-то еще. – kaiser
Нет, не совсем ... это характер асинхронного кодирования. Вы можете попробовать использовать глобальный метод, например '$ (document) .ajaxSuccess()', и проверить используемый url или какой-либо другой параметр, который указывает, что он связан с пейджером. – charlietfl
спасибо, я уже пытался связать ajaxSuccess с dataTable (родительский элемент paginator), но событие не запускается. – kaiser