TL; DR
Я использую sessionStorage для связи между различными частями надстройки, кода, выполняемого при нажатии кнопки ленты в окне создания, и диалогового окна, которое оно открывает.Это работает в браузере, но на рабочем столе Outlook SessionStorage в диалоговом окне пусто.Что дает?
// TL; DR
Я создал js-надстройку, которая отлично работает в браузере в Интернете, но ужасно сломана на рабочем столе.Я бы предпочел полностью отключить его на рабочем столе, поскольку есть надстройка VSTO, которая делает гораздо больше, чем способен js api, но, поскольку я не нашел способа сделать это, мой единственный вариант теперь выглядит так: makeверсия js работает глобально.
Я обнаружил, что на рабочем столе работает IE всех "браузеров", и я довольно далеко отлаживал надстройку с помощью IE на outlook.com, однако у меня закончились синтаксические ошибкии теперь я столкнулся с проблемой, которая проявляется только на рабочем столе.
Основная идея такова: когда пользователь запускает это действие, я хочу создать объект в 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.log в файл ..
-
edit: Итак, я добирался куда-то, хотя я не нашел хороших путей отладки,Если я записываю этот объект в localStorage, надстройка работает нормально, но, поскольку обрабатываются конфиденциальные данные, невозможно оставить их на диске навсегда.
Как мне тогда исправить это, поскольку кажется, что кнопка ленты и открытое диалоговое окно выполняются в отдельных сеансах с точки зрения Outlook / IE?