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