Можно ли использовать sessionStorage в надстройках Outlook-js для настольных компьютеров?

TL;DR

Я использую sessionStorage для связи между различными частями надстройки, кодом, выполняемым при нажатии кнопки на ленте в окне создания сообщения, и диалоговым окном, которое оно открывает. Это работает в браузере, но на рабочем столе Outlook sessionStorage в диалоговом окне пуст. Что дает?

//TL;DR

Я создал надстройку js, которая отлично работает в браузере в Интернете, но ужасно не работает на рабочем столе. Я бы предпочел полностью отключить его на рабочем столе, поскольку есть надстройка VSTO, которая делает гораздо больше, чем даже способен js API, но поскольку я не нашел способа сделать это, мой единственный вариант теперь кажется: сделать версия js работает глобально.

Я обнаружил, что на рабочем столе работает IE всех «браузеров», и я довольно далеко продвинулся в отладке надстройки с помощью IE на outlook.com, однако у меня закончились синтаксические ошибки, и теперь я столкнулся с проблемой, которая представляет только себя в Outlook на рабочем столе.

Основная идея такова: когда пользователь запускает это действие, я хочу создать объект в sessionStorage, если он не существует. Затем диалоговое окно прочитает объект и представит пользователю форму, после отправки этот объект будет обновлен, настройки будут применены, и диалоговое окно закроется. По какой-то причине в Outlook на рабочем столе при запуске диалогового окна sessionStorage для этого ключа имеет значение null, тогда как в браузере (даже с IE) он правильно инициализирован.

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

время кода:

кнопка диалога определена в манифесте как

<ExtensionPoint xsi:type = "MessageComposeCommandSurface">
...
    <Action xsi:type = "ExecuteFunction">
        <FunctionName>showMessageDialog</FunctionName>
    </Action>

который работает:

function showMessageDialog(event) {
    addinLogic.initializeMessage().done(function(messageItem) {
        addinSessionStorage.setItem('CurrentAccount', Office.context.mailbox.userProfile.emailAddress);
        addinSessionStorage.setItem(addinLogic.CurrentMessageItems, messageItem);
        $.when(openDialogAsIframe('/dialogfile.html')).always(function(){ event.completed(); });
    });
}
function openDialogAsIframe(dialogPage) {
    var def = $.Deferred();
    Office.context.ui.displayDialogAsync(
        window.location.protocol + '//' + window.location.host + dialogPage,
        { height: 50, width: 75, displayInIframe: true }, dialogCallback.bind(def));
    return def.promise();
}

В этот момент SessionStorage должен содержать объект, однако, когда диалог запускается, он возвращает сообщение о том, что объекта messageItem не было.

(function () {
    var _messageItem = null;
    ...
    Office.onReady( function addinLevelsControllerInit(reason) {
        app.initialize();
        $(function () {
            ...
            _messageItem = addinSessionStorage.getItem(addinLogic.CurrentMessageItems);
            if (!_messageItem) {
                Office.context.ui.messageParent('messageItem isnt there!');
                return;
            }

addinSessionStorage.getItem в основном делает window.sessionStorage || window.opener.sessionStorage || parent.window.opener.sessionStorage

До сих пор единственным способом получить какую-либо информацию было открыть окно F12 для чего-то другого и сказать ему остановиться при любом исключении, что дало мне сообщения об ошибках уровня IE6 без какой-либо возможности глубже исследовать состояние ошибки. Кропотливо я смог сузить проблему до этого места, и теперь лучший способ дальнейшей отладки, который я могу придумать, — это догадки и ответное сообщение через ui.messageParent. Если бы только был способ перенаправить console.info в файл..

--

edit: Итак, я кое-что добился, хотя и не нашел хороших способов отладки. Если я запишу этот объект в localStorage, надстройка работает нормально, но, поскольку обрабатываются конфиденциальные данные, невозможно оставить их на диске на всю вечность.

Как же мне исправить это, поскольку кажется, что кнопка ленты и открытый диалог работают в отдельных сеансах с точки зрения Outlook/IE?

Какой сценарий вы пытаетесь реализовать с помощью API хранилища сеансов? Можно ли решить ее с помощью API настройки роуминга?

Outlook Add-ins Team - MSFT 22.05.2019 02:02

@OutlookAdd-insTeam-MSFT Возможно, возможно, я бы смог, если бы правильно прочитал важное заявление об отказе от ответственности, но тогда чем это отличается от простого использования localStorage, за исключением того, что вместо локального хранения навсегда оно хранится в облаке навсегда. По крайней мере, с localStorage я получаю немедленные обновления и мне не нужно делать рабочую копию.

Noino 22.05.2019 06:57

@OutlookAdd-insTeam-MSFT Теперь, когда я потратил некоторое время на изучение заявления об отказе от ответственности, я должен сказать, что это зависит от того, что подразумевается под «когда надстройка загружается впервые». Если это означает, что каждый диалог загружается, тогда он будет работать (за исключением проблем, подробно описанных в последнем комментарии), если, однако, это означает, что только когда загружается первый компонент надстройки, тогда roamingSettings нельзя использовать для связи между различными частями надстройки

Noino 22.05.2019 07:11
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
3
648
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я не уверен, что это на 100% применимо к вашему случаю: но один трюк отладки, который я использовал в прошлом для проблем «на загрузке», заключается в следующем:

  1. Дайте панели задач/диалогу нормально загрузиться.

  2. Подключите Visual Studio (например, с помощью инструкций на странице https://docs.microsoft.com/en-us/office/dev/add-ins/testing/attach-debugger-from-task-pane). Найдите место в коде, где вы хотите установить точку останова; или используйте ключевое слово debugger; в самом коде (обратите внимание, что это не будет иметь никакого эффекта изначально, когда ваша надстройка загружается, потому что отладчик не подключен; но как только отладчик подключен, ключевое слово debugger; будет действовать как автоматическая точка останова) .

  3. В меню «Быстрый запуск» в правом верхнем углу Visual Studio запустите «Консоль JavaScript». Launch JavaScript Console

  4. В появившемся окне введите window.location.reload() и нажмите Enter:

<code>window.location.reload()</code>

  1. Теперь ваши точки останова должны срабатывать, и вы сможете отладить логику запуска.

Надеюсь это поможет!

~ Майкл

Ответ принят как подходящий

Поскольку sessionStorage — единственное место хранения, отвечающее требованиям автоматической очистки, обновляемое и совместно используемое между функциями надстройки; это единственный жизнеспособный выбор, о котором я знаю.

Однако в Outlook для настольных компьютеров сеансы не распределяются между всеми частями, поскольку IE, который Outlook использует для запуска надстроек js, ведет себя так, как будто он закрывается после выполнения каждой функции надстройки, таким образом очищая sessionStorage.

Кажется, я также нашел соответствующие фрагменты документации -- https://docs.microsoft.com/en-us/office/dev/add-ins/develop/dialog-api-in-office-add-ins#take-advantage-of-a-performance-option-in- офис-онлайн : "If the add-in is not running in Office Online, the displayInIframe is ignored." Что заставляет внешний вид рабочего стола открывать мой диалог в отдельном окне, таким образом https://docs.microsoft.com/en-us/office/dev/add-ins/develop/dialog-api-in-office-add-ins#use-the-office-dialog-api-with-single- страница-приложения-и-клиентская-маршрутизация"Important! The dialog box is in a new window with its own execution context ... Similarly, the dialog window has its own session storage, which is not accessible from code in the task pane."

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

Office.onReady(function(){
    addinLocalStorage = new addinStorage('localStorage');
    try { addinLocalStorage.setItem('_useSessionStorage', Office.context.mailbox.diagnostics.hostName != 'Outlook'); 
    } catch (e) {}

    if (addinLocalStorage.getItem('_useSessionStorage')) {
        addinSessionStorage = new addinStorage('sessionStorage');
    } else {
        addinSessionStorage = new addinStorage('localStorage', 'ss_');
    }
    ...
});

По сути, кнопка ленты имеет доступ к Office.context.mailbox, поэтому может установить платформу в localStorage. Диалог не имеет к нему доступа, что, кстати, является всей причиной, по которой я вообще вынужден использовать хранилище для связи, он может читать localStorage и на его основе решать, можем ли мы использовать sessionStorage или нет.

Теперь осталось только выяснить, какие объекты я могу удалить из localStorage, а какие оставить, чтобы данные не остались на диске навсегда.

О, и краткий ответ на вопрос в заголовке темы: НЕТ

Другие вопросы по теме