我正在为IBM BusinessSpace创建小部件,在分页方面遇到了一些困难。数据成功地从数据库返回(使用restlet)并显示在网格中。导航也显示在网格下方(下一页、上一页、转到页面、页数等)。例如,如果我有3页,每页5行,并且想导航到第二页,当我点击第2页时,数据会重新加载(似乎再次调用了restlet),前5行(显示在第一页上)也会显示在这一页上。若我选择任何其他导航选项(下一页,…),同样的事情也会发生。最重要的是,每次点击都会导致数据库中的前5行。有关于如何解决这个问题的线索吗?
这里有一个关于这个的代码:
dojo.require("dojo.data.ObjectStore");
dojo.require("dojox.grid.enhanced.plugins.Pagination");
dojo.require("dojox.grid.EnhancedGrid");
dojo.require("dojo.store.JsonRest");
var restStore = new dojo.store.JsonRest({target:"https://localhost:9443/Application/hello"});
var dataStore = dojo.data.ObjectStore({objectStore: restStore});
dojo.ready(function(){
var grid = new dojox.grid.EnhancedGrid({
store: dataStore, <br>
structure: [
{name:"Value", field:"value", width: "auto"},
{name:"RequestID", field:"requestId", width: "auto"},
{name:"ID", field:"id", width: "auto"},
{name:"Name", field:"name", width: "auto"}
],
columnReordering: true,
clientSort: true,
rowSelector: '20px',
rowsPerPage: 5,
autoHeight: true,
plugins: {
pagination: {
pageSizes: ["5", "10", "15", "All"], // page length menu options
description: true, // display the current position
sizeSwitch: true, // display the page length menu
pageStepper: true, // display the page navigation choices
gotoButton: true, // go to page button
position: "bottom" // position of the pagination bar
}
}
}, "gridDiv");
grid.startup();
});
在网格中使用jsonRest时,当您滚动未显示的记录时,尚未加载,此时jsonRest请求显示所需的数据,为了使该寻呼机按预期工作,在您的rest实现中,您必须使用dojo创建的头(范围:0-24),这个头是由dojo发送的,这样您就可以知道所需数据的偏移量和限制,对于响应,您必须返回一个标题(ContentRange:items 0-24/66),数字告诉dojo应该在哪里显示,以及总记录有多少。
这是php中的一个例子(假设db和response是实际对象):
$range = $request->headers->get('Range');
preg_match_all ('/.*?(d+).*?(d+)/is', $range, $matches);
$limit = $matches[2][0];
$offset = $matches[1][0];
$sql = "SELECT SQL_CALC_FOUND_ROWS * FROM table LIMIT {$limit} OFFSET {$offset}";
$result = $db->execute($sql);
$sql2 = "SELECT FOUND_ROWS()";
$count = $db->execute($sql2);
$response->setContent($result);
$response->headers->set('Content-Range', "items $offset-$limit/{$count}");
在jsonRest文档中有一些信息。