为什么Outlook的RoamingSettings对象在页面重新加载/重定向后使用旧值初始化?

时间:2017-05-17 14:49:36

标签: ms-office office365 outlook-addin office-js outlook-web-addins

先决条件:

编码

// The Office initialize function must be run each time a new page is loaded
Office.initialize = function (reason) {
    $(document).ready(function () {
        app.initialize();

         var settings = Office.context.roamingSettings;

        // Get the current value of the 'myKey' setting
        // let's assume it was set and stored with value "Hello World!" previously
        var value = settings.get('myKey');

        // Update the value of the 'myKey' setting
        settings.set('myKey', 'Reload World!');

        // Persist the change
        settings.saveAsync();

        var $btn_reload = $('#btnReload');
        $btn_reload.off('click').on('click', reloadThePage);
    });
};
function reloadThePage() {
    // re-load current page
    window.location.href = self.location.href;
};

工作流:

通过我们对value变量感兴趣的代码。第一次加载我们假设"值"设置为" Hello World!"。加载页面后,该值将设置为" Reload World!"并将保留到服务器邮箱。点击HTML按钮后会触发简单的页面重新加载。代码将再次开始执行整个序列。在Office.initialize我们的"漫游设置"之后的每个文档对象已经可以使用,我们检查"值"再次。我希望这个值能够重新加载世界!#34;,但我有旧的价值" Hello World!"。

当代码导航到另一个页面时,会发生同样的情况。此页面将类似于Office.initialize"漫游设置"仍将保持价值" Helllo World!"而不是保存新的价值"重新加载世界!"。

请注意,我们使用" saveAsync"存储到服务器的值真的改变了。这很容易验证。运行相同的方案,然后关闭加载项(加载项iframe)并再次重新打开它。 "值"在页面的初始加载将是正确的#34;重新加载世界!"。

结论(我对这个问题的猜测):

在调试问题时,我注意到Office.context.roamingSettings拥有两个不同的私有对象:一个叫做"设置......"第二个" rawSettings ..."。在初始加载" rawSetting ..."将保留所有设置和"设置..."不会在那里。首次访问特定设置键后,"设置..."对象创建和" RawSettings ..."将被设置为null。使用您实际使用的设置"设置..."。重新加载/重定向" RawSettings ..."再次出现,但它将保留未更新的旧数据。同时,如果您完全关闭加载项并再次打开它," rawSettings ..."将保留新的,更新的数据。

这让我觉得加载项的iFrame在某处保存了相同的数据,用于重新初始化"内存中#34;负载上的对象。在加载项启动期间,此数据将从邮箱中提取,但是当您重新加载页面或重定向到iFrame的应用程序数据的另一个页面时,将使用它并且它不是最新的。

有人会澄清这是否是它的设计方式?我是否错误地使用了该对象?

请注意,对于使用单页应用并且不需要重新加载任何页面的加载项,这不是问题。这种情况是由于某种原因,加载项需要重新加载整个页面(例如从头开始重新初始化所有内容)或使用多个页面应用程序。

3 个答案:

答案 0 :(得分:2)

这是一个已知问题,存在于待办事项中。我们目前没有ETA可供分享。

答案 1 :(得分:0)

我已为此问题创建了一种解决方法。这是我的博客文章的链接:

http://metrosharesolutions.com/blogs/office365development/roaming-settings-workaround/

以下是我的代码的链接:

https://github.com/joeparzel/RoamingFix

此解决方法会稍微禁用“自定义属性”功能,但它可以解决创建单页面的人的问题。以下是博文中的摘录:

  

为了完成此解决方案,我们添加了一些额外的内容   (可解析的)信息到使用密钥保存的值 -   特别是我们添加GUID和日期/时间戳。追加后   这个额外的信息值,我们将值保存到漫游   设置和自定义属性。这是因为“重装”   前面引用的Stack Overflow帖子中描述的问题。   最后,我们并没有真正从漫游设置中删除值/   定制属性数据库;而是我们将值设置为我们的代码   think表示“已删除”。要检索正确的值,代码将会   解密哪个值(漫游设置和自定义属性之间)   基于日期/时间戳是正确的,如果键是返回GUID   已被删除。

此解决方法的代码在MIT许可下,因此请在测试后随意下载并将其添加到您自己的生产Outlook插件中!

答案 2 :(得分:0)

根据文档,保存的值可以在下次使用该插件时检索,无论如何,只要我们需要在保存后直接检索该值,就无法重新加载该插件。我猜这可能是可以接受的解决方法。