先决条件:
Office.initialize
在任何对象访问之前调用编码
// 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的应用程序数据的另一个页面时,将使用它并且它不是最新的。
有人会澄清这是否是它的设计方式?我是否错误地使用了该对象?
请注意,对于使用单页应用并且不需要重新加载任何页面的加载项,这不是问题。这种情况是由于某种原因,加载项需要重新加载整个页面(例如从头开始重新初始化所有内容)或使用多个页面应用程序。
答案 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)
根据文档,保存的值可以在下次使用该插件时检索,无论如何,只要我们需要在保存后直接检索该值,就无法重新加载该插件。我猜这可能是可以接受的解决方法。