Почему объект Outlook 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;
};

Рабочий процесс:

В коде нас интересует 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, и они устарели.

Может кто-нибудь прояснить, так ли это? Я неправильно использую объект?

Обратите внимание, это не будет проблемой для надстроек, которые используют одностраничное приложение и не требуют повторной загрузки страницы. Это тот случай, когда по какой-то причине надстройке необходимо перезагрузить всю страницу (например, чтобы заново инициализировать все с нуля) или использовать многостраничное приложение.


person Slava Ivanov    schedule 17.05.2017    source источник
comment
Вы можете реализовать обратный вызов для saveAsync () и проверить asyncResult, который он передает в обратный вызов, на наличие ошибок.   -  person Marc LaFleur    schedule 17.05.2017
comment
@ MarcLaFleur-MSFT Marc, я просто код упростил, ошибок нет. SaveAsync работает нормально, я могу увидеть, как изменилось значение в почтовом ящике, посмотрев на свойства пакета отправленных сообщений с помощью OutlookSpy. AsyncResult возвращает успех. Значение вернулось к старому, когда я перезагружаю страницу (не закрывая надстройку) и снова прохожу через Office.initialize. После этого объект roamingSettings сохраняет старое значение. Есть ли другие предложения? Может быть, вы можете указать на проблему кого-нибудь из вашей команды? Спасибо.   -  person Slava Ivanov    schedule 17.05.2017


Ответы (3)


Это известная проблема, которая находится в очереди. В настоящее время у нас нет расчетного времени прибытия.

person Outlook Add-ins Team - MSFT    schedule 17.05.2017
comment
Отлично, спасибо за информацию. Мы используем одностраничное приложение, так что это не то, в чем мы отчаянно нуждаемся, но приятно знать, что я не сошел с ума;) - person Slava Ivanov; 18.05.2017
comment
Это делает RemoteSettings непригодным для использования. Можно ли добавить предупреждение в документы? (Я потратил на это целый день) - person Jim Hall; 20.10.2017
comment
@ OutlookAdd-insTeam, есть новости? С момента публикации вопроса прошло полгода. У меня такая же проблема. - person Niko; 24.11.2017
comment
Это известное ограничение. Мы обновляем документацию. - person Outlook Add-ins Team - MSFT; 28.11.2017

Я создал обходной путь для этой проблемы. Вот ссылка на мой пост об этом в блоге:

http://metrosharesolutions.com/blogs/office365development/roaming-settings-workaround/ < / а>

Вот ссылка на мой код:

https://github.com/joeparzel/RoamingFix

Этот обходной путь несколько отключит функциональность настраиваемых свойств, но решит проблему для тех, кто создает одностраничные программы. Вот выдержка из сообщения в блоге:

Чтобы решить эту проблему, мы добавили некоторую дополнительную (анализируемую) информацию к значению, которое сохраняется с ключом - в частности, мы добавляем GUID и отметку даты / времени. После добавления этой дополнительной информации к значению мы сохраняем значение как в параметрах роуминга, так и в пользовательских свойствах. Это сделано из-за проблемы «перезагрузки», описанной в сообщении о переполнении стека, о котором упоминалось ранее. Наконец, мы не удаляем значения из баз данных «Настройки роуминга» / «Пользовательские свойства»; вместо этого мы устанавливаем значения, которые, по мнению нашего кода, означают «удалено». Чтобы получить правильное значение, код расшифровывает, какое значение (между параметрами роуминга и настраиваемыми свойствами) является правильным, на основе отметки даты / времени и возвращает идентификатор GUID, если ключ был удален.

Код для этого обходного пути находится под лицензией MIT, поэтому не стесняйтесь загружать и добавлять его в свою рабочую надстройку Outlook… после тестирования, конечно же!

person MetroShare Solutions    schedule 05.01.2018
comment
Просто ссылка на вашу собственную библиотеку или руководство - не лучший ответ. Ссылка на него, объяснение, почему он решает проблему, предоставление кода о том, как это сделать, и отказ от того, что вы написали это, дает лучший ответ. См .: Что означает "хорошее" саморекламы? - person gunr2171; 06.01.2018
comment
@Gunr спасибо за комментарий. Я вкратце объяснил, что делает код технически, и не думаю, что копирование и вставка всего моего кода в ответ полезно, учитывая, что код может измениться. Есть ли что-то еще, что вы рекомендуете включить сюда? - person MetroShare Solutions; 06.01.2018

Согласно документации, сохраненное значение может быть получено при следующем использовании плагина, в любом случае нет возможности перезагрузить плагин всякий раз, когда нам нужно получить значение сразу после сохранения. Думаю, это может быть приемлемым обходным решением.

person Yazid Erman    schedule 22.01.2019
comment
Это больше похоже на еще один вопрос, разве нет возможности перезагрузить плагин, кроме ответа. Все дело в том, чтобы получить обновленные настройки после перезагрузки текущей страницы надстройки (или перехода на другую страницу) без перезагрузки надстройки. Спасибо за вклад в идею. - person Slava Ivanov; 22.01.2019