TL; DR

我使用sessionStorage在插件的不同部分之间进行通信,按撰写窗口中的功能区按钮时执行的代码,以及将打开的对话框。这在浏览器中有效,但是在桌面Outlook会话中对话框中的Storage为空。是什么赋予了?

// TL; DR

我构建了一个js插件,该插件在网络浏览器中可以正常工作,但在台式机上却严重损坏。我宁愿在桌面上完全禁用它,因为还有一个VSTO插件,其功能甚至超过了js api所能提供的能力,但是由于我还没有找到这样做的方法,所以我现在唯一的选择似乎是: js版本可在全球范围内使用。

我发现桌面上正在运行所有“浏览器”的IE,并且我已经在Outlook.com上使用IE调试了插件,但是我已经用完了语法错误,现在遇到的问题只是本身在桌面Outlook上。

基本思想是:当用户启动此操作时,除非存在该对象,否则我想在sessionStorage中创建一个对象。然后,该对话框将读取对象,并向用户显示一个表单,提交该对象后,将更新该对象,应用设置并关闭该对话框。
出于某种原因,在桌面Outlook上,启动对话框时,该键的sessionStorage为null,而在浏览器中(即使使用IE)也已正确初始化。

我曾尝试使用F12Chooser打开开发控制台,但由于它是在我要调试的代码运行后开始播放的,因此我不知道在执行对话框时我能做些什么。

编码时间:

对话框按钮在清单中定义为

<ExtensionPoint xsi:type="MessageComposeCommandSurface">
...
    <Action xsi:type="ExecuteFunction">
        <FunctionName>showMessageDialog</FunctionName>
    </Action>


运行:

function showMessageDialog(event) {
    addinLogic.initializeMessage().done(function(messageItem) {
        addinSessionStorage.setItem('CurrentAccount', Office.context.mailbox.userProfile.emailAddress);
        addinSessionStorage.setItem(addinLogic.CurrentMessageItems, messageItem);
        $.when(openDialogAsIframe('/dialogfile.html')).always(function(){ event.completed(); });
    });
}
function openDialogAsIframe(dialogPage) {
    var def = $.Deferred();
    Office.context.ui.displayDialogAsync(
        window.location.protocol + '//' + window.location.host + dialogPage,
        { height: 50, width: 75, displayInIframe: true }, dialogCallback.bind(def));
    return def.promise();
}


此时,sessionstorage应该包含该对象,但是,启动对话框时,它返回并告诉我messageItem对象不存在。

(function () {
    var _messageItem = null;
    ...
    Office.onReady( function addinLevelsControllerInit(reason) {
        app.initialize();
        $(function () {
            ...
            _messageItem = addinSessionStorage.getItem(addinLogic.CurrentMessageItems);
            if (!_messageItem) {
                Office.context.ui.messageParent('messageItem isnt there!');
                return;
            }



addinSessionStorage.getItem基本上是window.sessionStorage || window.opener.sessionStorage || parent.window.opener.sessionStorage

到目前为止,获取任何信息的唯一方法是打开F12窗口以显示其他内容,并告诉它在发生任何异常时停止运行,这使我获得了类似于IE6级别的错误消息,而无法深入研究错误状态。
辛苦地使我能够将问题缩小到此处,现在我能想到的进一步调试的最佳方法是猜测工作并通过ui.messageParent返回消息。
如果只有一种方法可以将console.log重定向到文件。

-

编辑:因此,即使我没有找到任何好的调试途径,我也已经到了某个地方。如果我将此对象写入localStorage,则外接程序可以正常工作,但是由于要处理敏感数据,因此永远无法将其保留在磁盘上。

从Outlook / IE的角度来看,似乎功能区按钮和打开的对话框似乎在单独的会话中运行,我该如何解决此问题?

最佳答案

我不确定这是否100%适用于您的情况:但是我过去用于“加载”问题的一种调试技巧是:


让任务窗格/对话框正常加载。
附加Visual Studio(例如使用https://docs.microsoft.com/en-us/office/dev/add-ins/testing/attach-debugger-from-task-pane中的说明)。在代码中找到您要设置断点的位置;或在代码本身内使用debugger;关键字(请注意,由于未附加调试器,因此在加载外接程序时最初不会起作用;但是一旦附加了调试器,debugger;关键字将充当自动断点)。
在Visual Studio右上方的“快速启动”菜单中,启动“ JavaScript控制台”
javascript - 是否可以在桌面Outlook-js插件上利用sessionStorage?-LMLPHP
在出现的窗口中,输入window.location.reload()并按Enter:


javascript - 是否可以在桌面Outlook-js插件上利用sessionStorage?-LMLPHP


您的断点现在应该可以捕获了-因此您应该能够调试启动逻辑。


希望这可以帮助!

〜迈克尔

关于javascript - 是否可以在桌面Outlook-js插件上利用sessionStorage?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56232763/

10-13 00:23