我正试图为我的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
的{{1}}和position
问题:我尝试动态创建卡的方式出了什么问题?我怎样才能成功地做到这一点?
感觉好像我在这里遗漏了一些非常简单的东西,但是我找不到导致问题的原因。
答案 0 :(得分:2)
所有卡参考均指向同一对象,因此,当您修改其中一个时,最终将全部更改。为避免这种现象,每次制作新卡时都要创建一张卡的副本。您可以使用DataGridView1.DataSource = Nothing;
DataGridView1.Rows.Clear(); DataGridView1.Refresh();
创建JSON对象的深层副本。这是代码的外观。
JSON.parse(JSON.stringify(JobCard))
希望这会有所帮助!
答案 1 :(得分:0)
除了在JSON文件中指定JobCard之外,您还可以在JavaScript文件中指定它,并导出一个将位置作为参数并返回JobCard的函数。这是一个示例:
// JobCard.js
function JobCard(position) {
return {
$schema: 'http://adaptivecards.io/schemas/adaptive-card.json',
type: 'AdaptiveCard',
version: '1.0',
body: [
{
type: 'Container',
items: [
{
type: 'TextBlock',
text: 'Your Job',
weight: 'bolder',
size: 'medium',
},
],
},
{
type: 'Container',
items: [
{
type: 'FactSet',
facts: [
{
title: 'Activity:',
value: position.activity,
},
{
title: 'Name:',
value: position.name,
},
],
},
],
},
],
}
}
module.exports = JobCard
// createCards.js
const { CardFactory } = require('botbuilder')
const JobCard = require('./JobCard')
function createCards(positions) {
return positions.map(position => CardFactory.adaptiveCard(JobCard(position)))
}
module.exports = createCards