我正在尝试将 channelData 与从页面中的机器人网络聊天控件发送的每条消息一起注入。我环顾四周,找到了此示例(https://cmsdk.com/javascript/how-to-send-custom-channel-data-when-using-web-chat-client-with-bot-framework.html),我的代码类似于下面的代码。
问题是这在Chrome中有效,但传播运算符(...)在Edge或IE上不起作用。是否有适用于所有浏览器的替代语法?
var user = {
id: '@User.Identity.Name',
name: '@User.Identity.Name'
};
var bot = {
id: BotId,
name: 'BotName'
};
var botConnect = new BotChat.DirectLine({
secret: '@ViewData["BotSecret"]',
webSockets: 'true'
});
var v = { ...botConnect };
debugger;
BotChat.App({
botConnection: {
...botConnect,
postActivity: activity => {
activity.channelData = {
StudentId: '@User.Identity.Name'
};
return botConnect.postActivity(activity);
}
},
user: user,
bot: bot,
resize: 'detect'
}, document.getElementById("bot"));
看起来 Babel 有一个插件,可以使用 Object.assign
将 Spread 运算符转换为等效代码。这并不能完全解决您的问题,因为IE仍然不支持Object.assign
- 在Babel的情况下,Object.Assign
包含一个polyfill。虽然在你的项目中包括 Babel 可能有点矫枉过正,但 MDN 有一个简单的独立Object.assign
polyfill 的示例代码,可能包含起来可能更合理。
如果这是一个令人满意的依赖关系,那么一旦Object.assign
可供您跨浏览器使用,Babel 文档建议这两行代码是等效的:
在:
z = { x, ...y };
外:
z = Object.assign({ x }, y);
只是关闭了这个循环,我与一些了解他们的JS的人一起工作,我们实现了一个适用于IE,Chrome和Edge的"传播等效"功能(尚未在Safari中测试过,但我想它也应该在那里工作)。
IE 不喜欢 => 运算符,所以我们也将其更改为函数,这是结果代码:
var user = {
id: '@User.Identity.Name',
name: '@User.Identity.Name'
};
var bot = {
id: 'TheBotId',
name: 'TheBotName'
};
var botConnect = new BotChat.DirectLine({
secret: 'TheBotSecret',
webSockets: 'true'
});
// Spread equivalent function
function getBotConnectionDetail(botconnection) {
var botConnectionDetail = {};
var keys = Object.keys(botconnection);
for (var i = 0; i < keys.length; i++) {
botConnectionDetail[keys[i]] = botconnection[keys[i]];
};
botConnectionDetail['postActivity'] = function (activity) {
activity.channelData = {
StudentId: '@User.Identity.Name'
};
return botconnection.postActivity(activity)
};
return botConnectionDetail;
}
// Invokes Bot
BotChat.App({
botConnection: getBotConnectionDetail(botConnect),
user: user,
bot: bot,
resize: 'detect'
},
document.getElementById("bot")
);