Перебор всех абзацев с элементами управления контентом с помощью API Office Javascript - PullRequest
0 голосов
/ 17 октября 2019

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

    Word.run((context) => {
      const { contentControls } = context.document;
      contentControls.load('items');
      return context.sync().then(() => {
        contentControls.items.forEach((contentControl) => {
          const range = contentControl.getRange();
          range.load();
          context.sync().then(() => {
            const paragraphList = range.paragraphs;
            paragraphList.load();
            context.sync().then(() => {
              console.log(paragraphList.items[0].text);
            });
          });
        });
      });
    });

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

word-web-16.00.debug.js:12031 Uncaught (in promise) RichApi.Error: The property 'items' is not available. Before reading the property's value, call the load method on the containing object and call "context.sync()" on the associated request context.
    at new RuntimeError (https://appsforoffice.microsoft.com/lib/1.1/hosted/word-web-16.00.debug.js:12031:22)
    at Function.Utility.createPropertyNotLoadedException (https://appsforoffice.microsoft.com/lib/1.1/hosted/word-web-16.00.debug.js:16760:11)
    at Utility.throwIfNotLoaded (https://appsforoffice.microsoft.com/lib/1.1/hosted/word-web-16.00.debug.js:16756:19)
    at ParagraphCollection.get [as items] 

I 'Я не уверен, почему некоторые строки, содержащие элементы управления содержимым, были бы успешно загружены, а другие - нет.

Мои вопросы:

1) Правильно ли я подхожу к этому, и

2) Почему загрузка данных настолько уникальна?

1 Ответ

2 голосов
/ 17 октября 2019

В вашем коде я вижу несколько проблем:

  1. Вам следует избегать вызова context.sync внутри цикла. См. Мой ответ на: документ не синхронизирован после замены текста . И см. Также пример файла Word-Add-in-Angular2-StyleChecker - service.js .
  2. У вас есть несколько «пустых загрузок»;то есть вызовы load(), которые не передают параметров. Это приведет к ненужной загрузке Office всех скалярных свойств. Вы должны загружать только те свойства, которые ваш код будет читать. Например, paragraphList.load() должно быть paragraphList.load("text").

Вот один из способов сделать это, который имеет только 2 context.sync с и ни один из них не находится в цикле.

Word.run((context) => {
  const contentControls = context.document.contentControls.load("items");
  const rangesInContentControls = [];

  return context.sync()
  .then(() => {
      contentControls.items.forEach((contentControl) => {
      rangesInContentControls.push(contentControl.getRange().load("paragraphs/text"));
    }); 
  })
  .then(context.sync)
  .then(() => {
      rangesInContentControls.forEach((range) => {
      console.log(range.paragraphs.items[0].text);
    }); 
  })
});
...