As with 这个另一个答案,答案将类似于this one。我可以看到您正在尝试使用 TypeScript,但您的代码与 JavaScript 的偏差很小,因此我将用 JavaScript 编写我的答案。
首先,您需要一种保存 [carousel] 状态的方法,以便可以更新 [carousel] 的活动。
this.carouselState = this.conversationState.createProperty('carouselState');
您需要采用一致的方式来生成 [carousel],以便在最初发送 [carousel] 和更新 [carousel] 时使用。
createCarousel(batchId, leads)
{
const cardArr = [];
let items = [
{ "Name": 'x', "LeadId": 1 },
{ "Name": 'a', "LeadId": 2 },
{ "Name": 'b', "LeadId": 3 },
{ "Name": 'c', "LeadId": 4 },
{ "Name": 'd', "LeadId": 5 }
];
items = items.filter(item => leads.includes(item.LeadId));
for (const item of items) {
const header = {
"type": "TextBlock",
"size": "Medium",
"weight": "Bolder",
"text": item.Name
};
const actions = [
{
"type": "Action.Submit",
"title": "Qualify",
"data": { [KEYACTION]: ACTIONQUALIFYLEAD, [KEYOBJECTID]: item.LeadId, [KEYBATCHID]: batchId }
}
];
const acard = CardFactory.adaptiveCard(
{
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"type": "AdaptiveCard",
"version": "1.0",
"body": [
header
],
"actions": actions
}
);
cardArr.push(acard);
}
return {
"type": "message",
"attachments": cardArr,
"attachmentLayout": AttachmentLayoutTypes.Carousel
};
}
这与您的代码类似,但有一些重要的区别。首先,我过滤项目数组以允许更少的项目,这就是您最终从轮播中删除卡片的方式。其次,我在每个操作的数据中包含一个“批次 ID”,这样您的机器人在收到操作的有效负载时就会知道要更新哪个活动。另外,这与您的问题无关,但我在大多数地方都使用字符串常量而不是字符串文字,我希望多次使用该字符串,这是我遵循的做法,以避免与拼写错误相关的错误等。
使用此功能,您可以像这样最初发送[轮播]
async testCarousel(turnContext) {
const batchId = Date.now();
const leads = [1, 2, 3, 4, 5];
const reply = this.createCarousel(batchId, leads);
const response = await turnContext.sendActivity(reply);
const dict = await this.carouselState.get(turnContext, {});
dict[batchId] = {
[KEYACTIVITYID]: response.id,
[KEYLEADS]: leads
};
}
您可以更新 [carousel] 以响应卡的 [qualify] 提交操作,如下所示
async handleSubmitAction(turnContext) {
const value = turnContext.activity.value;
switch (value[KEYACTION]) {
case ACTIONQUALIFYLEAD:
const dict = await this.carouselState.get(turnContext, {});
const batchId = value[KEYBATCHID];
const info = dict[batchId];
if (info) {
const leads = info[KEYLEADS];
const objectId = value[KEYOBJECTID];
var index = leads.indexOf(objectId);
if (index !== -1) leads.splice(index, 1);
const update = this.createCarousel(batchId, leads);
update.id = info[KEYACTIVITYID];
if (update.attachments.length) {
await turnContext.updateActivity(update);
} else {
await turnContext.deleteActivity(update.id);
}
}
break;
}
}