Office.Binding — сортировка привязок по иерархии в документе Word (угловой)

                            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() возвращает случайный список бингов...

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

Например:

Текст1 (выбран первым) Текст2 (выбран третьим) Текст3 (выбран вторым)

--

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

  1. Текст 1

  2. Текст2

  3. Текст3

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


person Marcin    schedule 29.01.2017    source источник
comment
это возможно?   -  person Marcin    schedule 30.01.2017
comment
Привет! интересные вопросы, но мне нужно некоторое разъяснение. 1) Что вы подразумеваете под иерархией? Вы имеете в виду порядок, в котором привязки находятся в порядке чтения документа? (сверху вниз) 2. Не уверен, что понимаю, зачем сохранять весь выделенный текст в списке привязок, чтобы у вас в вашем примере было 3 привязки? всего одна привязка? Ваш вопрос о получении привязок в пределах выбора в порядке чтения? Пожалуйста, уточните, чтобы я мог дать лучшее руководство. Спасибо!   -  person Juan Balmori    schedule 31.01.2017
comment
- вы имеете в виду порядок, в котором привязки находятся в порядке чтения документа - да, сверху-›вниз; - значит, у вас в примере 3 привязки -› да, у меня 3 привязки ( 3 объекта Office.Binding ); Мне нужен список всех привязок, какие привязки есть в порядке чтения документа - можно?   -  person Marcin    schedule 31.01.2017
comment
это возможно? Любые идеи?   -  person Marcin    schedule 04.02.2017
comment
да, извините за задержку, проверьте мой ответ ниже...   -  person Juan Balmori    schedule 10.02.2017


Ответы (1)


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

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

  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);
    })
 }

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

person Juan Balmori    schedule 09.02.2017