Предварительное условие:
- Простая надстройка Outlook с одной (случай перезагрузки) или двумя страницами HTML (случай перенаправления).
Office.initialize
вызывается до доступа к каким-либо объектам- Используйте объект RoamingSettings согласно документации: Как сохранить настройки почтового ящика пользователя для надстроек Outlook в качестве перемещаемых настроек
Кодирование:
// 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
наш объект "roamingSettings" готов к использованию, и мы снова проверяем "значение". Я ожидаю, что это значение будет «перезагрузить мир!», Но вместо этого у меня будет старое значение «Hello World!».
Такая же ситуация происходит, когда код переходит на еще одну страницу. Эта страница будет похожей, и после Office.initialize
"roamingSettings" по-прежнему будет содержать старое значение "Helllo World!" вместо сохраненного нового значения «Reload World!».
Обратите внимание, что значение, которое мы сохраняем на сервере с помощью saveAsync, действительно было изменено. В этом легко убедиться. Запустите тот же сценарий, а затем закройте надстройку (надстройку iframe) и снова откройте ее. «Значение» при начальной загрузке страницы будет правильным «Перезагрузить мир!».
Заключение (мои размышления по этому поводу):
При отладке проблемы я заметил, что Office.context.roamingSettings
содержит два разных частных объекта: один называется «settings ...», а второй «rawSettings ...». При начальной загрузке "rawSetting ..." будет содержать все настройки, а "Settings ..." не будет. После первого доступа к определенному ключу настроек, объект «Настройки ...» будет создан, а «RawSettings ...» будет обнулен. При работе с настройками вы фактически работаете с «Настройки ...». После повторной загрузки / перенаправления «RawSettings ...» появится снова, но в нем будут храниться старые данные, которые не были обновлены. В то же время, если вы полностью закроете надстройку и откроете ее снова, rawSettings ... будет содержать новые обновленные данные.
Это заставляет меня думать, что iFrame надстройки где-то хранит те же данные, которые используются для повторной инициализации объекта «в памяти» при загрузке. Во время запуска надстройки эти данные будут извлечены из почтового ящика, но при перезагрузке страницы или перенаправлении на другую страницу будут использоваться данные приложения из iFrame, и они устарели.
Может кто-нибудь прояснить, так ли это? Я неправильно использую объект?
Обратите внимание, это не будет проблемой для надстроек, которые используют одностраничное приложение и не требуют повторной загрузки страницы. Это тот случай, когда по какой-то причине надстройке необходимо перезагрузить всю страницу (например, чтобы заново инициализировать все с нуля) или использовать многостраничное приложение.