Я мог бы выяснить следующие варианты поведения при регистрации события Office.EventType.ItemChanged:
- Вы не можете зарегистрировать более одного обработчика событий.Большинство людей получают сообщение об ошибке, когда они пытаются зарегистрировать обработчик событий во второй раз, так что первый обработчик событий НЕ был незарегистрированным.
- Регистрация обработчика событий длится дольше срока действия веб-страницы вашей надстройки.,Это означает, что когда ваша надстройка выгружает текущую веб-страницу и перезагружает ту же или другую веб-страницу (т. Е. Она переходит на другую веб-страницу), регистрация вашего обработчика событий все равно будет сохранена.
- Отменив регистрацию обработчика события, вы должны не только указать имя функции обработчика, но и убедиться, что функция точно такая же, как вы использовали для регистрации события.Другими словами, если вы попытаетесь отменить регистрацию обработчика событий ПОСЛЕ перезапуска веб-страницы, объект функции-обработчика будет разным, и, следовательно, обработчик событий не будет незарегистрированным.
- Обработчик событиярегистрация теряется, когда Outlook закрывает панель надстроек.
Так что в вашем случае вам необходимо отменить регистрацию события перед вызовом 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);
Те, кто хочет перейти на ту же или другую веб-страницу из своей надстройки, могут прикрепить обработчики событий кликов к тегам привязки (или кнопкам), чтобы гарантировать, что обработчики событий 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;
});
});
});