【发布时间】:2016-12-11 06:00:52
【问题描述】:
The docs 说我应该可以通过DataTablesApiInstance.page(pageNumber) 设置页面,但我无法让它工作。
所有其他 API 方法,如 search 和 order 似乎都可以正常工作。
这是我的代码:
$(document)
.on('preInit.dt', (ev, settings) => {
let tableId = ev.target.id;
let tableState = _.get(['datatables', tableId], history.state) || {};
let api = new $.fn.dataTable.Api(settings);
if(tableState.hasOwnProperty('page')) {
api.page(tableState.page); // <-- problem is here; page doesn't get set
}
if(tableState.hasOwnProperty('search')) {
api.search(tableState.search);
}
if(tableState.hasOwnProperty('order')) {
api.order(tableState.order);
}
const setState = (key, value) => {
history.replaceState(_.set(['datatables', tableId, key], value, history.state), '');
};
api.on('page', ev => {
let info = api.page.info();
// console.log('page', tableId, info.page);
setState('page', info.page);
});
api.on('order', ev => {
let order = api.order();
// console.log('order', tableId, order);
setState('order', order);
});
api.on('search', ev => {
setState('search', api.search());
});
});
方法被命中,但页面未设置。我是否使用了错误的 API 方法?有没有其他方法可以在数据加载之前设置页面?
我正在使用datatables.net@1.10.12。
如果我将调用推迟到init 而不是preInit,则会突出显示正确的页码,但数据仍来自第一页。如果我在此之上添加 0ms 延迟(如下所示),它确实有效,但会导致第二次数据获取 + 绘制。
if(tableState.page) {
api.on('init', ev => {
setTimeout(() => {
api.page(tableState.page).draw('page');
}, 0);
});
}
如何在不产生第二个 ajax 请求的情况下设置页面?
【问题讨论】:
-
您还需要
draw()该页面 ->api.page(tableState.page).draw() -
@davidkonrad 谢谢,但我也试过了。
.draw('page')也是。没用。不过,我认为preInit上没有必要——它会在之后绘制。 -
发现这个:datatables.net/forums/discussion/comment/86374/#Comment_86374 看起来这个问题从未得到解决。我开了一张票:datatables.net/forums/discussion/39396/…
标签: datatables