Как перейти к следующей странице в источнике данных, который загружен в таблицу в Google AppMaker - PullRequest
0 голосов
/ 12 ноября 2018

Я работаю над требованием, когда у меня есть источник данных с именем 'emailSearchResults', в котором я ищу метаданные сообщений электронной почты и загружаю результаты в источник данных.

Однако поля в источнике данных не релевантныЯ установил для источника данных 50 записей на странице, как показано на снимке экрана ниже: enter image description here

Скрипт, который я использовал для загрузки источника данных, показан в поле запроса, которое вызывает следующееscript:

function getMessageDetails(userId, msgID)
{
  var messageDetails = [];
  var messageData;
  var msgID_,subject_,from_,date_;

  messageData=Gmail.Users.Messages.get(userId,msgID,{format:"metadata", metadataHeaders:["Message-ID", "Subject", "From", "Date"]});

  console.log(messageData.payload.headers);

  //console.log(msgID);
  //console.log(messageData.payload.headers[3].value);

  date_="<na>";
  from_="<na>";
  subject_="<na>";
  msgID_="<na>";

  for (var counter =0;counter<4;counter++)
  {
    if (messageData.payload.headers[counter].name=="Message-ID")
    {
      msgID_=messageData.payload.headers[counter].value;
    }

    if (messageData.payload.headers[counter].name=="Subject")
    {
      subject_=messageData.payload.headers[counter].value;
    }

    if (messageData.payload.headers[counter].name=="From")
    {
      from_=messageData.payload.headers[counter].value;
    }

    if (messageData.payload.headers[counter].name=="Date")
    {
      date_=messageData.payload.headers[counter].value;
    }
  }

  messageDetails.push(date_);
  messageDetails.push(from_);
  messageDetails.push(subject_);
  messageDetails.push(msgID_);

  return messageDetails;
}


function searchMessages(userId,condition)
{
  //
  // first we build the conditions
  // we can make it fixed
  // or we can make it dynamic
  var searchResult;
  var deleteResult;
  var currentMessage;
  var results = [];
  var pageToken;
  var params = {};
  var _stat;
  var options = {
    includeSpamTrash: "true",
    pageToken: pageToken
  };
  var msgRecord = [];

  do
  {
    searchResult=Gmail.Users.Messages.list(userId,options);

    for (var i = 0; i < searchResult.messages.length; i++)
    {
      var record=app.models.emailSearchResults.newRecord();
      msgRecord=getMessageDetails(userId,searchResult.messages[i].id);

      record.msgMainID=searchResult.messages[i].id;
      record.msgID=msgRecord[3];
      record.subject=msgRecord[2];
      record.senderAddress=msgRecord[1];
      record.msgDate=msgRecord[0];

      /*console.log(searchResult.messages[i].id);
      console.log(msgRecord[3]);
      console.log(msgRecord[2]);
      console.log(msgRecord[1]);
      console.log(msgRecord[0]);

      return;*/
      results.push(record);
      msgRecord=null;
    }

    if (searchResult.nextPageToken) {
      options.pageToken = searchResult.nextPageToken;
    }
  } while (searchResult.pageToken);

  searchResult=null;

  return results;
}

На главной странице я поместил таблицу и связал ее с источником данных, и включил разбивку на страницы, поэтому я получаю кнопки пейджера внизу таблицы, как показано ниже: enter image description here enter image description here

Когда я запускаю приложение и источник данных заполняется, я вижу результаты первой страницы в правильном виде, однако, когда я хочуперейти к следующей странице, я нажимаю кнопку следующей страницы и, как только загрузка завершена, я обнаруживаю, что я все еще вижу те же результаты с первой страницы таблицы.

Я не фамилияс тем, как заставить таблицу отображать результаты второй страницы, а затем третьей страницы, и я собираюсь по кругу об этом ...

Надеюсь, что объяснение понятно и решает проблему ..

Буду очень признателен за любую помощь в этом!Привет

1 Ответ

0 голосов
/ 13 ноября 2018

В настоящее время разбиение на страницы не работает должным образом с рассчитанными источниками данных.Вы можете, однако, построить свой собственный.Есть несколько изменений, которые вам нужно сделать, чтобы достичь этого.Сначала вы захотите изменить свою функцию searchMessages на что-то вроде этого:

function searchMessages(userId, pageToken){

  var results = [];
  var options = {
    includeSpamTrash: "true",
    pageToken: pageToken,
    maxResults: 50
  };

    var searchResult = Gmail.Users.Messages.list(userId, options);

    for (var i = 0; i < searchResult.messages.length; i++){
      var record = app.models.emailSearchResults.newRecord();
      var msgRecord = getMessageDetails(userId,searchResult.messages[i].id);

      record.msgMainID = searchResult.messages[i].id;
      record.msgID = msgRecord[3];
      record.subject = msgRecord[2];
      record.senderAddress = msgRecord[1];
      record.msgDate = msgRecord[0];

      results.push(record);
    }

  return {records: results, nextPageToken: searchResult.nextPageToken};
}

Затем вы захотите изменить запрос источника данных.Вам нужно будет добавить числовой параметр с именем page.

var cache = CacheService.getUserCache();
var page = query.parameters.page || 1;
var pageToken;
if(page > 1){
  pageToken = cache.get('pageToken' + page.toString());
}

var results = searchMessages('me', pageToken);

var nextPage = (page + 1).toString();
cache.put('pageToken' + nextPage, results.nextPageToken);

return results.records;

. Вам нужно будет изменить различные атрибуты виджета нумерации страниц.Вот функции предыдущего / следующего щелчка:

Предыдущий:

widget.datasource.query.pageIndex--;
widget.datasource.query.parameters.page = widget.datasource.query.pageIndex;
widget.datasource.load();

Следующий:

widget.datasource.query.pageIndex++;
widget.datasource.query.parameters.page = widget.datasource.query.pageIndex;
widget.datasource.load();

Вы должны иметь возможность взять его оттуда.

...