c# - 如何从 botframework v3 c# 发送事件并使用 Direct Line 在客户端 JavaScript 监听?
问题描述
如何仅在 MessagesController 或任何对话框触发某些事件时在 wc-shellinput 中使用 disabled 来禁用用户输入,并在用户完成所需的操作时启用它。如果我想在与聊天机器人对话期间浏览 Web 应用程序怎么办?这种类型的事件处理如何可能?
解决方案
根据此 WebChat 示例,您可以按照以下方式运行它:
将自定义 ChannelData 添加到您的传出活动(在机器人代码中)
有关更多信息,请参阅此示例。
var message = context.MakeMessage();
禁用输入
message.ChannelData = new { chatBox = "disable" }
启用输入
message.ChannelData = new { chatBox = "enable" }
发送消息
await context.PostAsync(message);
channelData.chatBox
为(在 index.html 脚本标签中)创建事件
const store = window.WebChat.createStore(
{},
({ dispatch }) => next => action => {
if (action && action.payload && action.payload.activity && action.payload.activity.channelData && action.payload.activity.channelData.chatBox) {
const event = new Event(`chatBox`);
event.data = action.payload.activity.channelData.chatBox;
window.dispatchEvent(event);
}
return next(action);
}
);
监听事件并启用/禁用聊天框(在 index.html 脚本标签中)
window.addEventListener('chatBox', ({ data }) => {
const chatBox = document.querySelector(`[data-id="webchat-sendbox-input"]`);
switch(data){
case 'enable':
chatBox.disabled = false;
break;
case 'disable':
chatBox.disabled = true;
break;
}
});
启用:
禁用:
只要确保您确保在禁用后根据需要重新启用它!
使用 BotChat
这几乎是一回事。您报告说 BotChat 没有检测到所有消息,所以我改用了事件。
创建/发送事件
var disable = new Activity()
{
Type = ActivityTypes.Event,
Value = new { chatBox = "disable" }
};
var enable = new Activity()
{
Type = ActivityTypes.Event,
Value = new { chatBox = "enable" }
};
await turnContext.SendActivityAsync(disable);
在 BotChat 中监听事件
botConnection.activity$
.subscribe(function (activity) {
if (activity.type === 'event' && activity.value.chatBox) {
controlInput(activity.value.chatBox);
}
});
function controlInput(action) {
const chatBox = document.querySelector(`[class="wc-shellinput"]`);
switch(action) {
case 'enable':
chatBox.disabled = false;
break;
case 'disable':
chatBox.disabled = true;
break;
}
}
注意:如果您使用的是标准 BotChat css,则输入颜色不会改变。您需要自己添加 css。类似于以下内容:
input:disabled {
background-color: black !important;
}
推荐阅读
- installshield - ISDEV 致命错误 1027 签名 .tmp 失败,禁用 SINGLE_EXE_IMAGE 签名
- flutter - 如何突出显示自定义底部应用栏图标并更改应用栏(顶部)标题文本颤动
- php - 无论搜索什么,MYSQL 搜索都会返回表中的所有结果
- crystal-reports - 水晶报表公式 If then else
- geolocation - 使用 SPARQL 查找经度和纬度
- python - Python 从二进制文件中每行只读取一个字符
- sql - 使用 Count 在 SQL 中计算百分比时未获得预期输出
- c++ - C++ 程序是否曾经访问过非标量对象?
- c++ - 如何计算数组中有多少元素满足某些条件(C++)?
- python - 如果条件满足熊猫,则根据另一列的升序将字符添加到列