有什么方法可以对团队消息传递扩展搜索查询启用分页吗?
Is there any way to enable pagination on teams messaging extension search queries?
我正在使用基于 MS 团队搜索的消息传递扩展程序,有什么方法可以捕获机器人中的滚动事件。
因此,当用户查询一个关键字时,counter=1,响应将有前10个匹配结果。
向下滚动后,我想用 counter=2 对同一关键字进行另一个查询,以 return 接下来的 10 个匹配结果。
使用 queryOption 数组可以启用分页。
分页参数:
skip:此查询的跳过计数
count:到return的元素个数。
请浏览 documentation 了解更多信息。
编辑:刚意识到你问的是消息扩展,但我认为这可能仍然适用,所以把它留在这里。
我能够实施不依赖于 TeamsActivityHandler(我未使用)的解决方案。在我的例子中,我创建了一个单独的对话框 (paginateDialog),它在开始对话框调用的选项中有一个数据数组和当前页面值。数据数组包含卡片定义,我将其显示为轮播。我下面的代码是针对这种情况的,所以如果您要发送不同类型的消息,您可能需要修改一些内容。
var paginate = require('array-paginate');
async displayItems (step) {
// Display the first page
var items = paginate(step._info.options.lineData, step._info.options.currentPage, PAGE_SIZE);
await step.context.sendActivity(MessageFactory.carousel(items.docs));
// If there are more items, prompt to continue and increment
if (items.hasNextPage == true) {
return await step.prompt(CHOICE_PROMPT, {
prompt: `I can only show you ${PAGE_SIZE} items at a time. Please select Next to continue or Done to return to the main dialog.`,
choices: [
{value: `Next ${PAGE_SIZE}`},
{value: 'Done'}
]
});
} else {
return await step.next();
}
}
async loopStep (step) {
if (step.result && step.result.value == `Next ${PAGE_SIZE}`) {
step._info.options.currentPage++;
return await step.replaceDialog(WATERFALL_DIALOG, step._info.options);
} else {
return await step.endDialog();
}
}
请注意,这可能不是很有效,尤其是当您有一个非常大的数组时,因为我每次都从整个数组重新创建分页。不过,如果需要,这允许您向前和向后遍历页面。我的功能只前进,但您可以创建前进和后退按钮,这些按钮可以根据 hasNextPage 和 hasPreviousPage 值 return 由 array-paginate
模块动态显示,然后根据适用的 increment/decrement 当前页面显示。
另一个注意事项,这是通过 return await step.beginDialog('PAGINATE_DIALOG', options);
调用的,这意味着当您结束该对话时,您将 return 到下一步的被调用方,无论您在该步骤的哪个位置调用对话(就像任何其他对话调用一样)。因此,请了解在 beginDialog
之后是否有任何提示或其他任何提示,您需要在 return 进入上一个对话框之前考虑 pagniateDialog 步骤中的那些。
我正在使用基于 MS 团队搜索的消息传递扩展程序,有什么方法可以捕获机器人中的滚动事件。
因此,当用户查询一个关键字时,counter=1,响应将有前10个匹配结果。 向下滚动后,我想用 counter=2 对同一关键字进行另一个查询,以 return 接下来的 10 个匹配结果。
使用 queryOption 数组可以启用分页。
分页参数:
skip:此查询的跳过计数
count:到return的元素个数。
请浏览 documentation 了解更多信息。
编辑:刚意识到你问的是消息扩展,但我认为这可能仍然适用,所以把它留在这里。
我能够实施不依赖于 TeamsActivityHandler(我未使用)的解决方案。在我的例子中,我创建了一个单独的对话框 (paginateDialog),它在开始对话框调用的选项中有一个数据数组和当前页面值。数据数组包含卡片定义,我将其显示为轮播。我下面的代码是针对这种情况的,所以如果您要发送不同类型的消息,您可能需要修改一些内容。
var paginate = require('array-paginate');
async displayItems (step) {
// Display the first page
var items = paginate(step._info.options.lineData, step._info.options.currentPage, PAGE_SIZE);
await step.context.sendActivity(MessageFactory.carousel(items.docs));
// If there are more items, prompt to continue and increment
if (items.hasNextPage == true) {
return await step.prompt(CHOICE_PROMPT, {
prompt: `I can only show you ${PAGE_SIZE} items at a time. Please select Next to continue or Done to return to the main dialog.`,
choices: [
{value: `Next ${PAGE_SIZE}`},
{value: 'Done'}
]
});
} else {
return await step.next();
}
}
async loopStep (step) {
if (step.result && step.result.value == `Next ${PAGE_SIZE}`) {
step._info.options.currentPage++;
return await step.replaceDialog(WATERFALL_DIALOG, step._info.options);
} else {
return await step.endDialog();
}
}
请注意,这可能不是很有效,尤其是当您有一个非常大的数组时,因为我每次都从整个数组重新创建分页。不过,如果需要,这允许您向前和向后遍历页面。我的功能只前进,但您可以创建前进和后退按钮,这些按钮可以根据 hasNextPage 和 hasPreviousPage 值 return 由 array-paginate
模块动态显示,然后根据适用的 increment/decrement 当前页面显示。
另一个注意事项,这是通过 return await step.beginDialog('PAGINATE_DIALOG', options);
调用的,这意味着当您结束该对话时,您将 return 到下一步的被调用方,无论您在该步骤的哪个位置调用对话(就像任何其他对话调用一样)。因此,请了解在 beginDialog
之后是否有任何提示或其他任何提示,您需要在 return 进入上一个对话框之前考虑 pagniateDialog 步骤中的那些。