Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms office 为什么是Outlook';在页面重新加载/重定向后,是否使用旧值初始化了s RoamingSettings对象?_Ms Office_Office365_Outlook Addin_Office Js_Outlook Web Addins - Fatal编程技术网

Ms office 为什么是Outlook';在页面重新加载/重定向后,是否使用旧值初始化了s RoamingSettings对象?

Ms office 为什么是Outlook';在页面重新加载/重定向后,是否使用旧值初始化了s RoamingSettings对象?,ms-office,office365,outlook-addin,office-js,outlook-web-addins,Ms Office,Office365,Outlook Addin,Office Js,Outlook Web Addins,前提条件: 带有一个(重新加载案例)或两个HTML页面(重定向案例)的简单Outlook加载项 Office.initialize在任何对象访问之前调用 根据文档使用RoamingSettings对象: 编码: // The Office initialize function must be run each time a new page is loaded Office.initialize = function (reason) { $(document).ready(fun

前提条件:

  • 带有一个(重新加载案例)或两个HTML页面(重定向案例)的简单Outlook加载项
  • Office.initialize
    在任何对象访问之前调用
  • 根据文档使用RoamingSettings对象:
编码:

// 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;
};
工作流:

// 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
变量感兴趣。第一次加载时,我们假设“value”设置为“helloworld!”。加载页面后,该值将设置为“重新加载世界!”,并将保留到服务器邮箱中。点击HTML按钮后将触发简单的页面重新加载。代码将再次开始执行整个序列。根据
Office.initialize之后的文档,我们的“roamingSettings”对象已准备好使用,我们再次检查“值”。我希望这个值是“reload World!”,但是我有一个旧值“Hello World!”

当代码导航到另一个页面时,也会出现同样的情况。此页面将类似于Office之后的
。初始化
“漫游设置”仍将保留旧的值“Helllo World!”,而不是保存的新值“Reload World!”

请注意,我们使用“saveAsync”存储到服务器的值实际上已更改。这很容易验证。运行相同的场景,然后关闭外接程序(外接程序iframe)并再次重新打开它。初始加载页面时的“值”将是正确的“重新加载世界!”

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

调试该问题时,我注意到
Office.context.roamingSettings
包含两个不同的私有对象:一个称为“设置…”,另一个称为“设置…”。初始加载时,“RAWSETING…”将保留所有设置,“Settings…”将不存在。首次访问特定设置键后,创建的“设置…”对象和“原始设置…”将设置为空。使用设置时,您实际上使用的是“设置…”。重新加载/重定向后,“RawSettings…”再次出现,但它将保存未更新的旧数据。同时,若您完全关闭外接程序并再次打开它,“rawSettings…”将保存新的更新数据

这让我觉得外接程序的iFrame在某处保存着相同的数据,用于在加载时重新初始化“内存中”对象。在外接程序启动期间,此数据将从邮箱中提取,但当您重新加载页面或重定向到应用程序的另一页面时,将使用来自iFrame的数据,并且该数据不是最新的

有人能澄清一下这是怎么设计的吗?我是否错误地使用了该对象


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

这是一个已知的问题,正在积压工作中。我们现在没有要分享的预计到达时间

我已经为这个问题创建了一个解决方案。以下是我的博客文章的链接:

以下是我的代码链接:

此解决方法将在某种程度上禁用自定义属性功能,但它解决了创建单页机的用户的问题。以下是这篇博文的摘录:

为了完成此解决方案,我们添加了一些额外的 (可解析)使用键保存的值的信息- 具体来说,我们添加了一个GUID和一个日期/时间戳。追加 这额外的信息值,我们保存的价值,以双方漫游 设置和自定义属性。这是因为“重新加载” 前面引用的堆栈溢出帖子中描述的问题。 最后,我们并不真正从漫游设置中删除值/ 自定义属性数据库;相反,我们将值设置为我们的代码所需要的值 thinks表示“已删除”。要检索正确的值,代码将 解密哪个值(漫游设置和自定义属性之间) 基于日期/时间戳正确,如果键 已被删除


此解决方案的代码在麻省理工学院许可证下,因此可以免费下载并将其添加到您自己的生产Outlook加载项中…当然,在测试之后

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

您可能希望实现saveAsync()的回调,并检查它传递到回调中的异步结果是否有错误。@Marclafler MSFT Marc,我只是简化了代码,没有错误。“SaveAsync”工作正常,通过使用OutlookSpy查看sendboxed邮件包属性,我可以看到邮箱中的值发生了更改。“AsyncResult”返回“success”。当我重新加载页面(不关闭外接程序)并再次通过“Office.initialize”时,该值恢复为旧值。之后,“roamingSettings”对象将保留旧值。还有其他建议吗?也许你能指出你团队中的其他人的问题?谢谢。太好了,谢谢你的信息。我们使用单页应用程序,所以这不是我们迫切需要的东西,但很高兴知道我没有发疯;)这使得RemoteSettings无法使用。我们可以在文档中添加一个警告吗?(我已经为此浪费了一整天)@OutlookAdd insTeam,有消息吗?问题发表已经半年了。我也有同样的问题。这是一个已知的限制。我们正在更新文档。仅仅链接到您自己的库或教程不是一个好答案。链接到它,解释它解决问题的原因,提供关于如何解决问题的代码,并否认您编写了它,这有助于获得更好的答案。请参阅:@Gunr感谢您的评论。我简要地解释了t