javascript - 使用 Microsoft Bot Framework 动态创建具有不同内容的自适应卡片
问题描述
我正在尝试为我的 Azure 聊天机器人创建一个自适应卡片轮播。
我有一个对象列表,对于这个列表中的每个项目,我想创建一个新的自适应卡。
这是我发送卡片轮播的地方:
await step.context.sendActivity({
text: "I've found the following job positions:",
attachments: this.createCards(positions),
attachmentLayout: AttachmentLayoutTypes.Carousel
});
这是createCards
:
const JobCard = require('../../resources/jobCard.json');
createCards(positions) {
let cards = [];
positions.forEach(function(position) {
let cardJson = JobCard;
cardJson.body[0].columns[0].items[0].text = position.name;
cardJson.body[0].columns[0].items[1].text = position.activities;
let adaptativeCard = CardFactory.adaptiveCard(cardJson);
cards.push(adaptativeCard)
})
return cards;}
问题是:所有卡片都显示相同的内容。显示的卡片数量与 的数量相应positions
,但所有卡片都显示position.name
和position.activities
的第position
一个positions
。
问题:我尝试动态创建卡片的方式有什么问题?我怎样才能成功地做到这一点?
感觉就像我在这里遗漏了一些非常简单的东西,但我找不到导致问题的原因。
解决方案
您所有的卡片引用都指向同一个对象,因此当您修改其中一个时,您最终会更改所有这些。为防止出现这种情况,请在每次制作新卡片时创建一张卡片副本。您可以使用它JSON.parse(JSON.stringify(JobCard))
来创建 JSON 对象的深层副本。这是您的代码的外观。
createCards(positions) {
let cards = [];
positions.forEach(function(position) {
let cardJson = JSON.parse(JSON.stringify(JobCard));
cardJson.body[0].columns[0].items[0].text = position.name;
cardJson.body[0].columns[0].items[1].text = position.activities;
let adaptativeCard = CardFactory.adaptiveCard(cardJson);
cards.push(adaptativeCard)
})
return cards;
}
希望这可以帮助!
推荐阅读
- postgresql - Postgres 是否将 bytea 数据以十六进制形式存储在服务器上?
- r - 从 Twitter API 过滤数据框以排除 R 中的非英文文本
- react-native - React Native应用程序中的应用程序状态更改时如何防止apollo useQuery钩子重置?
- sql-server - SSMS 中缺少 SQL Server 代理?
- c# - 如何在 Visual Studio 的 C# Windows 窗体应用程序中嵌入 html 文件?
- c# - 更改 appsettings.json 文件中值的简单快捷方式
- ios - 在什么情况下 App Store 收据可能会丢失或无效?
- c++ - OpenGL 视口从 -50 到 50 而不是 -1 到 1
- apache-flink - flink-sql:如何检查数组类型是否包含给定元素?
- ngx-charts - 如何在 ngx-chart 中设置主题属性?