return new Promise((resolve, reject) => {
x = context.sendActivity({
text: 'hi',
attachments: [CardFactory.adaptiveCard(menuJson)]
})
我试图发送一个自适应卡,其中包含一个input.text字段…现在我的问题是如何使用上下文对象从程序中的用户获取输入数据?
即如何使用node js处理bot framework v4中的自适应卡?
最佳答案
自适应卡发送的提交结果与普通用户文本略有不同。当用户在聊天室中输入并发送一条正常消息时,它将以context.activity.text
结尾。当用户在自适应卡上填写输入时,它最终会出现context.activity.value
,这是一个对象,其中键名是id
中的menuJson
,值是自适应卡中的字段值。
例如,json:
{
"type": "AdaptiveCard",
"body": [
{
"type": "TextBlock",
"text": "Test Adaptive Card"
},
{
"type": "ColumnSet",
"columns": [
{
"type": "Column",
"items": [
{
"type": "TextBlock",
"text": "Text:"
}
],
"width": 20
},
{
"type": "Column",
"items": [
{
"type": "Input.Text",
"id": "userText",
"placeholder": "Enter Some Text"
}
],
"width": 80
}
]
}
],
"actions": [
{
"type": "Action.Submit",
"title": "Submit"
}
],
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"version": "1.0"
}
……创建一张看起来像:
如果用户在文本框中输入“testing testing 123”并点击提交,则
context.activity
将类似于:{ type: 'message',
value: { userText: 'Testing Testing 123' },
from: { id: 'xxxxxxxx-05d4-478a-9daa-9b18c79bb66b', name: 'User' },
locale: '',
channelData: { postback: true },
channelId: 'emulator',
conversation: { id: 'xxxxxxxx-182b-11e9-be61-091ac0e3a4ac|livechat' },
id: 'xxxxxxxx-182b-11e9-ad8e-63b45e3ebfa7',
localTimestamp: 2019-01-14T18:39:21.000Z,
recipient: { id: '1', name: 'Bot', role: 'bot' },
timestamp: 2019-01-14T18:39:21.773Z,
serviceUrl: 'http://localhost:58453' }
用户提交可以在
context.activity.value.userText
中看到。请注意,自适应卡提交是作为回发发送的,这意味着提交数据不会作为会话的一部分出现在聊天窗口中,而是保留在自适应卡上。
使用自适应卡Waterfall Dialogs
你的问题与此不太相关,但由于你可能最终会尝试这样做,我认为在我的回答中包含这一点可能很重要。
从本质上说,自适应卡不像提示那样工作。有了提示,将显示提示并等待用户输入,然后继续。但是对于自适应卡(即使它包含一个输入框和一个提交按钮),自适应卡中没有会导致瀑布式对话框在继续对话框之前等待用户输入的代码。
因此,如果您使用的是接受用户输入的自适应卡,那么您通常希望处理用户在瀑布式对话框上下文之外提交的任何内容。
也就是说,如果您想使用自适应卡作为瀑布对话框的一部分,则有一个解决方法。基本上,你:
显示自适应卡
显示文本提示
将用户的自适应卡输入转换为文本提示的输入
在瀑布对话框文件(步骤1和2)中:
async displayCard(step) {
// Display the Adaptive Card
await step.context.sendActivity({
text: 'Adaptive Card',
attachments: [yourAdaptiveCard],
});
// Display a Text Prompt
return await step.prompt('textPrompt', 'waiting for user input...');
}
async handleResponse(step) {
// Do something with step.result
// Adaptive Card submissions are objects, so you likely need to JSON.parse(step.result)
...
return await step.next();
在
bot.ts
文件中(步骤3):const activity = dc.context.activity;
if (!activity.text.trim() && activity.value) {
activity.text = JSON.stringify(activity.value);
}