如何在Input.ChoiceSet选择标签时触发handleTeamsMessagingExtensionSelectItem?
问题分析与解决方案
核心问题
composeExtension/selectItem 是专门处理消息扩展搜索结果列表中选择项的事件,和你在Adaptive Card里使用Input.ChoiceSet的选择操作完全不是同一个场景,所以不会触发该事件。
具体修正步骤
1. 调整Adaptive Card的交互逻辑
给Input.ChoiceSet所在的Adaptive Card添加Action.Submit操作,用户选择标签后通过提交动作触发对应的invoke事件。示例卡片片段:
{ "type": "AdaptiveCard", "body": [ { "type": "Input.ChoiceSet", "id": "tagsChoiceSet", "choices": [ { "title": "标签1", "value": "tag1" }, { "title": "标签2", "value": "tag2" } ], "placeholder": "选择标签" } ], "actions": [ { "type": "Action.Submit", "title": "确认选择", "data": { "msteams": { "type": "task/submit" } } } ], "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", "version": "1.4" }
2. 修改代码中的事件处理逻辑
在onInvokeActivity中添加对task/submit事件的处理,替换原有的composeExtension/selectItem分支:
public async onInvokeActivity(context: any): Promise<any> { console.log("context.activity.name is ", context.activity.name); if (context.activity.name == "application/search") { let searchQuery = context.activity.value.queryText; // other code } // 处理任务模块提交事件,对应Adaptive Card的Action.Submit if (context.activity.name == "task/submit") { console.log("tag is chosen"); return TeamsBot.createInvokeResponse( await this.handleTeamsMessagingExtensionSelectItem( context, context.activity.value ) ); } return super.onInvokeActivity(context); }
3. 修正manifest中的命令配置
你的tagsChoiceSet命令使用了fetchTask=true加载任务模块,把命令类型从query改为action更符合语义:
{ "id": "tagsChoiceSet", "type": "action", // 将query改为action "title": "Find tag", "description": "", "initialRun": false, "fetchTask": true, "context": [ "commandBox", "message", "compose" ] }
补充说明
- 若通过
fetchTask返回任务模块,用户提交卡片时会触发task/submit事件; composeExtension/selectItem仅在用户选择消息扩展搜索结果列表中的卡片项时才会触发,和当前ChoiceSet交互场景无关。
内容的提问来源于stack exchange,提问作者user23266137
相关产品推荐
相关产品推荐

