【问题标题】:Best way for displaying total Pages for a datasource in Appmaker在 Appmaker 中显示数据源总页数的最佳方式
【发布时间】:2018-05-29 10:42:16
【问题描述】:

我有一个存储空缺职位列表的 Google 驱动器表数据源。现在在数据源中,我将“Query per size”字段设置为 10,以便每页可以获得 10 条记录。我还添加了一个寻呼机来显示分页。

我的查询是我想向我的最终用户显示“X 页的第 1 页”,这个 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;

【问题讨论】:

    标签: google-app-maker


    【解决方案1】:

    如果您的表中没有任何过滤器,您的服务器代码可以很简单

    // Server script
    function getPagesCount(pageSize) {
      var recordsCount = app.models.MyModel.newQuery().run().length;
      var pagesCount = Math.ceil(recordsCount / pageSize);
    
      return pagesCount;
    }
    

    作为替代方案,您可以考虑使用单个字段 PagesCount 创建 Calculated Model

    如果您有一些与表格关联的过滤器,那么您需要使用完全相同的过滤器运行页码查询。

    整个设置很可能无法有效地使用 Drive Tables,因为如果不查询记录本身就无法查询记录编号。使用 Cloud SQL 数据后端,可以使用轻量级原生 SQL 查询创建Calculated SQL Model(这里:PageSize 是查询参数,应该等于实际数据源的query.limit):

    SELECT
      Ceil(COUNT(1) / :PageSize) AS RecordsNumber
    FROM
      TableName
    WHERE
      ...
    

    【讨论】:

    【解决方案2】:

    我已经按照 Pavel 的建议使用计算模型实现了这一点。

    步骤:

    1. 创建一个包含一个字段计数的计算数据源。
    2. 在该数据源中添加一个参数searchQuery。这将包含用户过滤器。目前我只有一个搜索查询,用户可以在其中搜索很多东西。所以我只添加了一个参数。
    3. 在此数据源中添加以下服务器脚本。

    代码:

    // 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;
    }
    

    .

    1. 在 Appmaker 页面上为该数据源绑定一个标签。
    2. 在搜索查询/您的过滤器应用事件中添加以下代码,重新加载此数据源并将值分配给参数。
    // Client script
    function updateRecordCount(newValue) {
      var ds = app.datasources.RecordCount;
      ds.query.parameters.searchQuery = newValue;
      ds.unload();
      ds.load();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-17
      • 1970-01-01
      • 2023-03-16
      • 2011-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多