2017-01-27 2 views
-1

Я хочу сохранить свои пользовательские данные в файл презентации PowerPoint. Я использую этот пример: https://github.com/OfficeDev/Excel-Add-in-JavaScript-PersistCustomSettingsOffice add-in PowerPoint - хранить пользовательские данные в файл не работает

Но я хочу хранить свои данные во время надстройки Office, когда вы выгружаете приложение (для примера, когда пользователь закрывает файл презентации).

Поэтому я использую window.onunload = function() {}... для обнаружения, когда документ презентации начинает закрываться.

И во время закрытия PowerPoint, метод:

Office.context.document.settings.saveAsync() 

возвращение ошибки: Saving failed. error: An internal error has occurred.

Пример кода

home.html:

<html> 
<head> 
    <meta charset="UTF-8" /> 
    <meta http-equiv="X-UA-Compatible" content="IE=Edge" /> 

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

    <script src="Home.js" type="text/javascript"></script> 
</head> 
<body> 
    <button id="setData">Set data</button> 
</body> 
</html> 

Home.js:

(function() { 
    "use strict"; 

    Office.initialize = function (reason) { 
     $(document).ready(function() { 

      console.log('>>> Office.initialize()'); 

      // TODO: If you wanted to save the settings stored in the app's property 
      // bag before the app is closed - for instance, for saving app state - 
      // add a handler to the Internet Explorer window.onunload event. 
      window.onunload = function() 
      { 
       saveSettingsToFile(); 
      }; 

      $('#setData').click(SetData); 
     }); 
    }; 

    function SetData() 
    { 
     saveToPropertyBag('dataKey', 'myData'); 
    } 

    // Stores the settings in the JavaScript APIs for Office property bag. 
    function saveToPropertyBag(key, value) 
    { 
     // Note that Project does not support the settings object. 
     // Need to check that the settings object is available before setting. 
     if (Office.context.document.settings) 
     { 
      Office.context.document.settings.set(key, value); 
     } 
     else 
     { 
      console.log('Error: Feature not supported: the settings object is not supported in this host application'); 
     } 
    } 

    function saveSettingsToFile() 
    { 
     if (Office.context.document.settings) { 
      Office.context.document.settings.saveAsync(
      function (asyncResult) { 
       if (asyncResult.status == Office.AsyncResultStatus.Failed) 
       { 
        console.log('Saving failed. error: ' + asyncResult.error.message); 
       } 
       else { 
        console.log('Saving success'); 
       } 
      }); 
     } 
    } 

})(); 

ответ

1

К сожалению, вы не можете использовать событие OnUnload таким образом. Когда надстройка закрыта, так это соединение с документом.

Я предлагаю позвонить Office.context.document.settings.saveAsync() с помощью функции saveToPropertyBag(). Если вы не постоянно вносите изменения в мешок имущества, на это не должно быть накладных расходов. В качестве альтернативы, если вам нужно сделать несколько изменений в быстрой последовательности, вы можете позвонить saveAsync() сразу после.

Если событие закрытого/закрытого типа представляет интерес, в программе] Developer Developer Platform UserVoice] (https://officespdev.uservoice.com/forums/224641-feature-requests-and-feedback/suggestions/17572624-need-to-have-an-onclose-event-for-the-task-pane-or) есть запрос на функцию, который может использовать ваш голос. :)

+0

Благодарим вас за разъяснения, onunload/onclose будет хорошим функционалом для состояния текущего состояния магазина. – Jarikus

+0

Проблема заключается в onunload/onclose в вашей надстройке после того, как соединение между вашей надстройкой и документом было снесено. На данный момент не существует способа захвата закрытия до этого разрыва. –