【发布时间】:2020-04-11 19:01:23
【问题描述】:
我正在使用带有 nodejs 的 Microsoft 团队机器人。我正在渲染一个自适应卡片轮播,每张卡片都有动作。我的要求是删除单击该操作的单个卡片。可能吗?
当前代码如下所示。我已经尝试过 deleteActive 但这会删除整个轮播
const {
TurnContext,
TeamsActivityHandler,
CardFactory,
AttachmentLayoutTypes,
ActionTypes
} = require('botbuilder');
class TeamsConversationBot extends TeamsActivityHandler {
constructor() {
super();
this.onMessage(async (context:any, next:any) => {
TurnContext.removeRecipientMention(context.activity);
console.log("context activigty at the begin is:" + JSON.stringify(context.activity))
let msg = context.activity.text
let action = context.activity.value
if(msg.startsWith('lead')){
msg = 'lead'
}
if(action !== undefined){
console.log("user did some action on a card")
msg = action.action
}
switch (msg) {
case 'lead':
await this.lead(context)
break;
case 'qualify_lead':
await this.qualifyLead(context)
break;
}
await next();
});
}
/**
*
* @param context this method does a lead qualification
*/
async qualifyLead(context:any){
console.log("in qualifyLead:" + JSON.stringify(context.activity))
//await context.deleteActivity(context.activity.replyToId)
const leadId = context.activity.value.objectId
console.log("Lead to qualify is:" + leadId)
await context.sendActivity('Lead is qualified')
}
/**
* Search contact by name
* @param context
* @param keyword
*/
async lead(context:any){
console.log("Start of lead with context:" + JSON.stringify(context))
const cardArr = []
let items = [
{"Name": 'x', "LeadId": "1"},
{"Name": 'a', "LeadId": "2"},
{"Name": 'b', "LeadId": "3"},
{"Name": 'c', "LeadId": "4"},
{"Name": 'd', "LeadId": "5"}
]
for(const item of items){
const header = {
"type": "TextBlock",
"size": "Medium",
"weight": "Bolder",
"text": item.Name
}
const actions = [
{
"type": "Action.Submit",
"title": "Qualify",
"data": { "action" : "qualify_lead", "objectId" : item.LeadId }
}
]
const acard = CardFactory.adaptiveCard(
{
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"type": "AdaptiveCard",
"version": "1.0",
"body": [
header,
''
],
"actions": actions
}
)
cardArr.push(acard)
console.log("payload is::::" + JSON.stringify(acard))
}
const reply = {
"attachments" : cardArr,
"attachmentLayout" : AttachmentLayoutTypes.Carousel
}
await context.sendActivity(reply);
}
}
module.exports.TeamsConversationBot = TeamsConversationBot;
【问题讨论】:
-
从未尝试过,但我认为您需要使用 cardArr.filter 或类似的东西从 cardArr 数组中删除单击的值。您也必须重新生成轮播。
-
嗯,听起来我需要把整个卡片的有效载荷传回去做我需要做的事情,然后用更少的卡片把它发回去
-
我相信我能帮上忙,但你能修复你的代码示例吗?
await next();在您的onMessage处理程序中重复,您在某些地方有多余或缺少的右括号,您的卡片正文有 null 作为其元素之一,并且“动作”包含在正文中,等等。我们如何修复您的如果我们不知道这些问题是在您的实际代码中还是只是复制和粘贴代码的产物?确保在编辑器中格式化代码,以便于阅读。 (由于这个帖子有很多人,你需要@提及我,以便我看到你的回复。) -
@KyleDelaney 我已经通过修复问题和尽可能简化来重新添加代码。请指教
-
@MoblizeIT - 在 VS Code 中,您可以使用 alt+shift+F 自动格式化文档
标签: node.js typescript botframework microsoft-teams adaptive-cards