2017-01-29 13 views
0
      Office.context.document.bindings.getAllAsync((result: Office.AsyncResult) => {    
           if (result.status == Office.AsyncResultStatus.Succeeded) { 
            for (let attBinding of result.value) { 
             var binding = attBinding as Office.Binding; 
            } 
           } 
          }) 

Мы разрабатываем приложение Office с хранилищем с выделенным текстом. Мы сохраняем выбранный текст в списке привязок. Но нам нужен отсортированный список по выделенному диапазону текста в целом документе. Но функция getAllAsync() возвращает случайный список bingings ...Office.Binding - сортировка привязок по иерархии в документе документа (угловая)

Как мы можем сортировать эти привязки по иерархии в документе?

Например:

Text1 (выбирается первая) Text2 (выбирается третья) Text3 (выбирается вторая)

-

и нам нужно отсортированный список, как:

  1. Текст1

  2. Text2

  3. Text3

Не случайный список!

+0

возможно? – Marcin

+0

Привет! Интересные вопросы, мне нужно некоторое разъяснение. 1) Что вы подразумеваете под иерархией? вы имеете в виду порядок, в котором привязки находятся в порядке чтения документа? (сверху вниз) 2. Не уверен, что я понимаю, что «сохранить весь выделенный текст в списке привязок», чтобы у вас в вашем примере было 3 привязки? только одна привязка? Ваш вопрос о получении привязок в пределах выбора в порядке чтения? Просьба уточнить, поэтому я могу дать лучшее руководство. благодаря! –

+0

- «вы имеете в виду порядок, в котором привязки находятся в порядке чтения документа» - да, сверху-> вниз; - «так что у вас в вашем примере 3 привязки» -> да, у меня есть 3 привязки (3 объекта Office.Binding); Мне нужен список всех привязок, которые привязки находятся в порядке чтения документа - это возможно? – Marcin

ответ

0

Да, вы можете! Ключ здесь заключается в том, чтобы иметь в виду, что создание привязки эффективно добавляет элемент управления содержимым в документ, поэтому вам нужно использовать коллекцию contentControls, применяемую либо к выбору, либо к телу документа, и пройти его, чтобы получить порядок чтения. (btw не ясно из вашего вопроса, если вам нужно только на выбор или весь документ, но я объясню, как).

Теперь несколько уточнений до образца:

  1. Действительно, метод bindings.getAllAsync() не совпадает с порядком чтения, но его не случайным либо. Он фактически возвращает привязки в своем порядке создания, что кажется нецелесообразным для вашего сценария.
  2. С другой стороны, коллекция range.contentControls (диапазон может быть выбором или телом документа) предоставит вам все элементы управления содержимым в пределах диапазона в порядке чтения документа. Обратите внимание, что эта коллекция будет включать как элементы управления содержимым с привязками и без них. Поэтому вам нужно убедиться, что когда вы создаете привязки, вы делаете это так, чтобы впоследствии их узнавать, это просто сделать, поскольку с помощью нового API вы можете вставить элемент управления контентом, настроить его заголовок а затем используйте метод bindings.addFromNamedItemAsync для создания привязки с использованием заголовка. Вы также можете настроить тег элемента управления содержимым для идентификации в контексте вашего решения, которое представляет собой привязку.

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

Создать Переплет:

function insertContentControlWithBinding() { 
 
    Word.run(function (context) { 
 
     //first we insertTheContentCOntrol on the selection, then set the title and tags and finally create the binding. 
 
     var myContentControl = context.document.getSelection().insertContentControl(); 
 
     context.load(myContentControl); 
 
     return context.sync() 
 
      .then(function() { 
 
       myContentControl.title = "identifier"; //this will be used later to create the binding. 
 
       myContentControl.tag = "BOUND"; //used to mark as a bound content control. 
 
       return context.sync() 
 
        .then(function (context) { 
 
         Office.context.document.bindings.addFromNamedItemAsync("identifier", Office.BindingType.Text, {}, function (result) { 
 
          if (result.status = Office.AsyncResultStatus.Succeeded) { 
 
           console.log("binding Created succesfully") 
 
          } 
 
         }) 
 

 
        })  
 
      }) 
 

 
    }).catch(function (e) { 
 
     console.log(e.message); 
 
    }) 
 
}

Получить привязки в порядке чтения: Это действительно ответ на ваш вопрос, но я подумал, что хорошее объяснение того, что происходит, будет полезно. спасибо за терпение!

function getBindingsinReadingOrder() { 
 
    Word.run(function (context) { 
 
     var myContentControls = context.document.body.contentControls; 
 
     context.load(myContentControls); 
 
     return context.sync() 
 
      .then(function() { 
 
       // lets traverse the content controls and checl which ones are bound by checking the tag. 
 
       for (var i = 0; i < myContentControls.items.length; i++) { 
 
        if (myContentControls.items[i].tag == "BOUND") { 
 
         //its a binding! lets print the content 
 
         console.log(myContentControls.items[i].text); 
 
        } 
 
        else { 
 
         console.log("not a bound cc"); 
 
        } 
 
       } 
 
      }) 
 
    }).catch(function (e) { 
 
     console.log(e.message); 
 
    }) 
 
}

Надеюсь, это добавляет ясности и разблокирует свой сценарий. Спасибо и счастливое кодирование! Хуан.

 Смежные вопросы

  • Нет связанных вопросов^_^