使用Microsoft Bot Framework动态创建具有不同内容的自适应卡

时间:2019-03-04 18:49:36

标签: javascript botframework

我正试图为我的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

问题:我尝试动态创建卡的方式出了什么问题?我怎样才能成功地做到这一点?

感觉好像我在这里遗漏了一些非常简单的东西,但是我找不到导致问题的原因。

2 个答案:

答案 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