在我的Outlook WebAddin中,我正在尝试使用以下代码注册邮件ItemChange事件。
Office.context.mailbox.addHandlerAsync(Office.EventType.ItemChanged, mailItemSelectionChanged, [], function (result) {
if(result && result.status != 'succeeded'){
console.error('result => ' + result);
}
});
每当用户在固定模式下更改邮件时,我都会第一次收到邮件更改事件。然后,如果对话发生变化,我将使用 location.reload()重新加载插件以清除缓存并加载新的插件。
重新加载插件后,它无法注册mailItemChange事件并抛出以下错误:
{"代码":5001,"消息":"发生内部错误。","名称": "内部错误"}
它在浏览器和一些Windows机器中失败(在许多其他情况下工作)。
outlookDiagnostics :
{" host":" Outlook"," platform":" OfficeOnline"," version": " 16.0.9215.1000"}
答案 0 :(得分:2)
我可以找出有关Office.EventType.ItemChanged事件注册的以下行为:
因此,根据您的情况,您需要在调用location.reload()之前注销事件,如下所示。
Office.context.mailbox.removeHandlerAsync(Office.EventType.ItemChanged, {handler: mailItemSelectionChanged}, function(result) {
if (result.status === Office.AsyncResultStatus.Failed) {
console.log('Item Change event could not be unregistered.');
console.log(result.error);
}
else {
console.log('Item Change event unregistered successfully.');
}
});
setTimeout(function() {location.reload();}, 100);
那些想要从其外接程序导航到相同或另一个网页的人,他们可以将click事件处理程序附加到锚标记(或按钮),以确保在当前事件之前已注销ItemChanged事件处理程序。页面已卸载。我使用以下代码完成了此操作:
$(document).ready(function() {
$('.NavBarContainer a').toArray().forEach(function(anchor1, index) {
$(anchor1).click(function(event) {
if(itemChangeEventRegistered) {
unregisterItemChangeHandler();
setTimeout(function() {window.location = anchor1.href;}, 100);
return false;
}
return true;
});
});
});