在 Appmaker 中显示数据源总页数的最佳方式
Best way for displaying total Pages for a datasource in Appmaker
我有一个 Google 驱动器 table 数据源,用于存储未平仓头寸列表。现在在数据源中,我将 "Query per size" 字段设置为 10,这样我每页可以获得 10 条记录。我还添加了一个寻呼机来显示分页。
我的查询是我想像 "Page 1 of X" 一样显示给我的最终用户,这个 X 会根据某些搜索过滤器而有所不同。在 Appmaker 中实现此目标的最佳方法是什么?
我尝试按照以下代码计算数据源中的总记录数,但每次都使用搜索条件更新并重新计算它并不是一个合适的解决方案。
//Server side
var newQuery = app.models.Company.newQuery();
var records = newQuery.run();
var totalCount =0;
for(var i=0;i<records.length;i++)
{
totalCount=totalCount+1;
}
return totalCount;
如果您的table中没有任何过滤器,您的服务器代码可以像
一样简单
// Server script
function getPagesCount(pageSize) {
var recordsCount = app.models.MyModel.newQuery().run().length;
var pagesCount = Math.ceil(recordsCount / pageSize);
return pagesCount;
}
作为替代方案,您可以考虑使用单个字段 PagesCount
.
创建 Calculated Model
如果您有一些与 table 关联的过滤器,那么您将需要 运行 使用完全相同的过滤器查询页码。
整个设置很可能无法有效地使用 Drive Tables,因为如果不查询记录本身就无法查询记录数。使用 Cloud SQL 数据后端,可以使用轻量级原生 SQL 查询创建 Calculated SQL Model(此处 :PageSize
是查询参数,应等于实际的 query.limit
数据源):
SELECT
Ceil(COUNT(1) / :PageSize) AS RecordsNumber
FROM
TableName
WHERE
...
我已经按照 Pavel 的建议使用计算模型实现了这一点。
步骤:
- 创建一个具有一个字段计数的计算数据源。
- 在该数据源中添加一个参数
searchQuery
。这将包含用户过滤器。目前我只有一个搜索查询,用户可以在其中搜索很多东西。所以我只添加了一个参数。
- 在此数据源中添加以下服务器脚本。
代码:
// Server script
function getTotalRecords(query) {
var receivedQuery = query.parameters.searchQuery;
// console.log('Received query:' + query.parameters.searchQuery);
var records = app.models.Company.newQuery();
records.parameters.SearchText = query.parameters.searchQuery;
if(receivedQuery !== null) {
records.where = '(Name contains? :SearchText or InternalId contains? ' +
':SearchText or LocationList contains? :SearchText )';
}
var recordsCount = records.run().length;
var calculatedModelRecords = [];
var draftRecord = app.models.RecordCount.newRecord();
draftRecord.count = ''+recordsCount;
calculatedModelRecords.push(draftRecord);
return calculatedModelRecords;
}
.
- 在 Appmaker 页面上将标签与此数据源绑定。
- 在搜索时query/your 过滤器应用事件添加以下代码重新加载此数据源并将值分配给参数。
// Client script
function updateRecordCount(newValue) {
var ds = app.datasources.RecordCount;
ds.query.parameters.searchQuery = newValue;
ds.unload();
ds.load();
}
我有一个 Google 驱动器 table 数据源,用于存储未平仓头寸列表。现在在数据源中,我将 "Query per size" 字段设置为 10,这样我每页可以获得 10 条记录。我还添加了一个寻呼机来显示分页。
我的查询是我想像 "Page 1 of X" 一样显示给我的最终用户,这个 X 会根据某些搜索过滤器而有所不同。在 Appmaker 中实现此目标的最佳方法是什么?
我尝试按照以下代码计算数据源中的总记录数,但每次都使用搜索条件更新并重新计算它并不是一个合适的解决方案。
//Server side
var newQuery = app.models.Company.newQuery();
var records = newQuery.run();
var totalCount =0;
for(var i=0;i<records.length;i++)
{
totalCount=totalCount+1;
}
return totalCount;
如果您的table中没有任何过滤器,您的服务器代码可以像
一样简单// Server script
function getPagesCount(pageSize) {
var recordsCount = app.models.MyModel.newQuery().run().length;
var pagesCount = Math.ceil(recordsCount / pageSize);
return pagesCount;
}
作为替代方案,您可以考虑使用单个字段 PagesCount
.
如果您有一些与 table 关联的过滤器,那么您将需要 运行 使用完全相同的过滤器查询页码。
整个设置很可能无法有效地使用 Drive Tables,因为如果不查询记录本身就无法查询记录数。使用 Cloud SQL 数据后端,可以使用轻量级原生 SQL 查询创建 Calculated SQL Model(此处 :PageSize
是查询参数,应等于实际的 query.limit
数据源):
SELECT
Ceil(COUNT(1) / :PageSize) AS RecordsNumber
FROM
TableName
WHERE
...
我已经按照 Pavel 的建议使用计算模型实现了这一点。
步骤:
- 创建一个具有一个字段计数的计算数据源。
- 在该数据源中添加一个参数
searchQuery
。这将包含用户过滤器。目前我只有一个搜索查询,用户可以在其中搜索很多东西。所以我只添加了一个参数。 - 在此数据源中添加以下服务器脚本。
代码:
// Server script
function getTotalRecords(query) {
var receivedQuery = query.parameters.searchQuery;
// console.log('Received query:' + query.parameters.searchQuery);
var records = app.models.Company.newQuery();
records.parameters.SearchText = query.parameters.searchQuery;
if(receivedQuery !== null) {
records.where = '(Name contains? :SearchText or InternalId contains? ' +
':SearchText or LocationList contains? :SearchText )';
}
var recordsCount = records.run().length;
var calculatedModelRecords = [];
var draftRecord = app.models.RecordCount.newRecord();
draftRecord.count = ''+recordsCount;
calculatedModelRecords.push(draftRecord);
return calculatedModelRecords;
}
.
- 在 Appmaker 页面上将标签与此数据源绑定。
- 在搜索时query/your 过滤器应用事件添加以下代码重新加载此数据源并将值分配给参数。
// Client script
function updateRecordCount(newValue) {
var ds = app.datasources.RecordCount;
ds.query.parameters.searchQuery = newValue;
ds.unload();
ds.load();
}