Добавление office.js добавляет # в URL-адрес, а затем удаляет его

У меня есть веб-сайт со средним стеком. Изначально views/index.html<ui-view></ui-view>) является точкой входа для всех страниц. Он использует angular-ui-router и html5mode. Таким образом, https://localhost:3000/XXXX в браузере останется прежним (вместо добавления #) и будет отображать соответствующий контент в зависимости от маршрутизатора.

Затем я хочу, чтобы сервер также обслуживал надстройку Office. Мне понадобится views/addin.html, который содержит office.js, и еще один маршрутизатор, чтобы сайт обслуживал набор URL-адресов https://localhost:3000/addin/XXXX, и мне все равно, будет ли это html5mode или нет (URL-адрес может где-то содержать #).

Итак, вот соответствие routes/index.js:

router.get('/addin/*', function (req, res) {
    console.log("router.get /addin/*");
    res.sendfile('./views/addin.html')
});

router.get('*', function(req, res) {
    console.log("router.get *");
    res.sendfile('./views/index.html');
});

А вот и views/addin.html:

<html>
<head>
    <title>F-addin</title>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-router/0.3.2/angular-ui-router.js"></script>
    <!--<script src="https://appsforoffice.microsoft.com/lib/1/hosted/office.js"></script>-->
    <base href="/" />
</head>
<body ng-app="addinF">
    addin content
    <ui-view ng-cloak></ui-view>
</body>
<script>
    var addinApp = angular.module('addinF', ['ui.router'])
    addinApp.config(['$stateProvider', '$locationProvider', function ($stateProvider, $locationProvider) {
        $stateProvider
            .state('addinNew', {
                url: '/addin/new',
                template: "new page"
            })
            .state('addinHome', {
                url: '/addin/home',
                template: "home page"
            })
        $locationProvider.html5Mode(true);
    }]);
</script>
</html>

Когда office.js прокомментирован, как указано выше, https://localhost:3000/addin/new и https://localhost:3000/addin/home в браузере работают хорошо. Однако, когда office.js раскомментирован, наблюдается странное поведение: ввод https://localhost:3000/addin/new в браузере изменится на https://localhost:3000/#/addin/new, а затем снова изменится на https://localhost:3000/addin/new. И мы увидим, как addin content new page появится один раз и исчезнет.

С раскомментированным office.js, если мы загрузим файл манифеста с <SourceLocation DefaultValue="https://localhost:3000/addin/new"/>, мы также увидим, что в области задач addin content new page появляется один раз и исчезает, а затем Add-in Error Something went wrong and we couldn't start this add-in. Please try again later or contact your system administrator.

Без html5mode здесь .../addin/new или .../addin/home в браузере будет отображаться только addin content; надстройку можно загрузить, только с addin content тоже.

Моя цель — заставить работать надстройку, указывающую на .../addin/new или .../addin/home. office.js должен быть где-то загружен. Я не возражаю, если это будет html5mode (т. е. URL-адрес имеет #), но поведение в любом случае будет странным или неудовлетворительным. Кто-нибудь знает, как это исправить или есть обходной путь?


person SoftTimur    schedule 01.07.2017    source источник


Ответы (1)


Глядя на отладочную версию файла office.js:

https://appsforoffice.microsoft.com/lib/1/hosted/office.debug.js

Вы увидите, что функции replaceState и pushState истории окна имеют значение null:

window.history.replaceState = null;
window.history.pushState = null;

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

В уменьшенной версии office.js вы можете найти эти две строки, выполнив поиск:

window.history.replaceState=e;window.history.pushState=e;

Вы можете удалить эти две строки кода, чтобы снова включить html5mode, но я не уверен, что плагин office.js будет работать правильно.

person Elwin Arens    schedule 01.07.2017
comment
Спасибо... Скопировал office.js на локалку, так что https://localhost:3000/static/office.js хорошо показывает файл. Но загрузка addin.html с новой ссылкой выдала ошибку в консоли Uncaught SyntaxError: Unexpected token < :3000/static/o15apptofilemappingtable.js:1. Я всегда получаю эту ошибку, независимо от того, удаляю ли я эти две строки window.history... - person SoftTimur; 01.07.2017