Надстройка PowerPoint работает только после третьей инициализации в Office Online - PullRequest
0 голосов
/ 30 ноября 2018

Контекст


В моей компании я отвечаю за разработку надстройки типа Content App только для PowerPoint. Надстройка построена с ASP.NET MVC (4.5) и AngularJS (1.6.8), а без проблем работает на клиенте PowerPoint (версия 1811, сборка 11029.20079).

Процедура испытаний Windows 10 64-битнаяChrome, v70.0.3538.110 (официальная сборка) (64-разрядная версия)Adblocker отключен

Манифест использован Этот манифест прошел средство проверки (https://www.npmjs.com/package/office-addin-validator).

<OfficeApp xmlns="http://schemas.microsoft.com/office/appforoffice/1.1" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:type="ContentApp">
  <Id>xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx</Id>
  <Version>1.0.0.0</Version>
  <ProviderName>My Company</ProviderName>
  <DefaultLocale>en-US</DefaultLocale>
  <DisplayName DefaultValue="Office Add-in name" />
  <Description DefaultValue="Office Add-in description." />
  <IconUrl DefaultValue="https://my-company.com/PluginLogo32.png" />
  <HighResolutionIconUrl DefaultValue="https://my-company.com/PluginLogo64.png" />
  <SupportUrl DefaultValue="https://my-company.com/support/" />
  <AppDomains>
    <AppDomain>my-company.com</AppDomain>
  </AppDomains>
  <Hosts>
    <Host Name="Presentation" />
  </Hosts>
  <Requirements>
    <Sets DefaultMinVersion="1.1">
      <Set Name="Settings" />
    </Sets>
    <Methods>
      <Method Name="Settings.get" />
      <Method Name="Settings.set" />
      <Method Name="Settings.remove" />
      <Method Name="Settings.saveAsync" />
    </Methods>
  </Requirements>
  <DefaultSettings>
    <SourceLocation DefaultValue="https://my-company.com/plugin" />
    <RequestedWidth>800</RequestedWidth>
    <RequestedHeight>600</RequestedHeight>
  </DefaultSettings>
  <Permissions>ReadWriteDocument</Permissions>
  <AllowSnapshot>true</AllowSnapshot>
</OfficeApp>

Используется инициализация Office

<script src="https://appsforoffice.microsoft.com/lib/1/hosted/office.js" type="text/javascript"></script>
<script type="text/javascript">

    var init = function () {
        App.tags = @Html.Raw(WorkContext.ActivPortalUserEntity.GetUserTagsAsJson());
        App.languages = @Html.Raw(LocalizationManager.GetPortalJsonScript());
        App.AP_URL = '@WorkContext.Uri';
        App.V_KEY_FORM = '@AntiforgeryHelper.GetTokenName()';
        App.V_VALUE_FORM = '@AntiforgeryHelper.GetToken()';
        App.LabelURLSuffix = '';
        App.URLSuffix = '@Model.TemplateDocument.URLSuffix';
        App.IsDefaultUser = @Json.Encode(WorkContext.ActivPortalUserEntity.IsDefaultUser);
        App.DashboardParametersQueryString = '@Html.Raw(Model.RenderContext.Request.GetParametersAsQuerystring())';
        App.DashboardFilters = @Html.Raw(@JsonConvert.SerializeObject(Model.RenderContext.Request.GlobalCriteriaObjects));
        App.ZoomFilters = @Html.Raw(@JsonConvert.SerializeObject(Model.RenderContext.Request.GlobalCriteriaIndexes));
        App.WebPartFormatUseCorner = true;
        App.DeportedToggleView = true;
        App.ToggleViewMode = 'accordion';
        App.searchPlaceHolderText = "@Resource("L_appSearchPlaceHolder_Text", "Portal")";
        App.viewType = '';
        App.documentRepository = '@ApplicationConfigService.ActivPortalServerConfig.DocumentsRepository';
        App.WPAllowIconsHide = false;
        App.Language = '@WorkContext.UserLanguage';
        App.searchURL = [];
        App.EditMode = false;
        App.EditContentMode = false;
        App.CATALOG_PROXY = '@WorkContext.Uri' + 'Portal/CatalogProvider';
        App.RENDER_URL = '@WorkContext.Uri' + 'Portal/Render';
        App.CHOICE_PROXY = '@WorkContext.Uri' + 'Portal/Render/TemplateRequest';
        App.POST_TEMPLATE_PROXY = '@WorkContext.Uri' + 'Portal/Render/TemplateRequest';
        App.moduleScripts = @Html.Raw(JsonConvert.SerializeObject(Model.GetPageScripts()));
        App.moduleStylesSheets = @Html.Raw(@JsonConvert.SerializeObject(Model.GetPageStyles()));
        App.angularClientContext = @Html.Raw(@Html.GetJsonClientContext());

        App.scriptDebug = (typeof App.scriptDebug == undefined) ? false : App.scriptDebug;
        App.ScriptsManager = new Activportal.UI.Resources({ scriptDebug: App.scriptDebug });
        App.StylesManager = new Activportal.UI.Resources();

        //Localization
        MinimizeTip_Text = "@Resource("L_Minimize_Text", "Portal")";
        ExpandTip_Text = "@Resource("L_Maximize_Text", "Portal")";
        ErrorUpdatingPart_Text = "@Resource("L_InvalidURL_Text", "Portal")";
        ConfirmRemoveGlobalFilter_Text = "@Resource("L_ConfirmRemoveGlobalFilter_Text", "Portal")";
        WaitMessage_Text = "@Resource("L_WaitMessage_Text", "Portal")";
        SessionEnd_Text = "@Resource("L_SessionEndMessage_Text", "Portal")";

        window.addEvent('domready', function () {
            App.isDashboardLoaded();
            App.Start();
        });
    };

    try {
        if (Office) {
            Office.initialize = init;
        }
        else {
            console.log("Office.js is missing.");
            if (!window.external.GetContext) {
                init();
            }
        }
    } catch (e) {
        console.log(e);
    }
</script>

Проблема


Просто повторюсь, надстройка без проблем работает на клиенте PowerPoint 2016 (см. Версию выше).Однако в PowerPoint Online я борюсь с проблемой : инициализация надстройки.

  1. Когдавставка надстройки или перезагрузка страницы входа отображается с непрозрачностью следующим образом: Add-in initialization

  2. Затем через 2 секунды появляется это сообщение: «Извините...Мы не смогли запустить надстройку, потому что столкнулись с проблемой. Попробуйте позже или обратитесь к системному администратору. "Add-in initialization error messageЕдинственное сообщение, которое я получаю с консоли, это следующее: enter image description here

  3. На данный момент я считаю 1 инициализацию.Когда я нажимаю «DÉMARRER», происходит то же самое (вторая инициализация).И потом, когда я нажимаю снова (третий инициал).Надстройка, наконец, работает как на клиенте PowerPoint.Вот как выглядит страница входа в систему.https://imgur.com/F9QNvvg

Итак, в Office Online это только третья инициализация, надстройка работает.Я заметил примерно одинаковое поведение для всех основных браузеров в их последней версии.

Вопрос


Что-то мне не хватает? Я открыт для любых предложений, я не нашел решения по этому конкретному вопросу.

1 Ответ

0 голосов
/ 19 февраля 2019

Что я сделал, чтобы решить эту проблему
Что ж, моя ошибка заключалась в том, что я плохо понимал, как работает Office.js.

На моей странице входа в систему
- ядобавлен скрипт Office.js.
- я инициализирую скрипт.

if (Office) {
   if (Office.context === undefined) {
      Office.onReady(function () { });
   }
}

На моей главной странице
- я меняю способ инициализации скрипта.

if (Office) {
   if (Office.context === undefined) {
      Office.onReady(function () { });
   }
}

Заключение
Кажется, что Office.js должен присутствовать на первой странице приложения.И на каждой странице, использующей Office API.

Кроме того, лучше использовать Office.onReady (), а не Office.initialize ().

На заметку:

  • Мне пришлось связаться с Microsoft, чтобы выяснить это решение.Документация не так уж и очевидна?
  • У меня все еще есть какая-то ошибка в консоли, но я могу без проблем использовать надстройку и API.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...