1

Я разрабатываю JavaScript API для Office, MS Word 2016, VisualStudio 2015. В документе есть несколько Rich Text ContentContols с тем же заголовком. Я пытаюсь связать эти ContentControls с обработчиком, чтобы получить уведомление onBindingDataChanged.Как связать один обработчик с несколькими ContentControls (с тем же заголовком) в Word? Использовать Javascript API для Office

Есть ли способ привязать ContentControls к одному обработчику со своим идентификатором? или передать идентификатор ContentControls в качестве одного параметра?

Мой текущий код, как:

function bindNamedItem() { 

    Office.context.document.bindings.addFromNamedItemAsync("CCTitle", Office.BindingType.Text, { id: 'ccbind' }, function (result) { 
     if (result.status == 'succeeded') { 
      console.log('Added new binding with type: ' + result.value.type + ' and id: ' + result.value.id); 
     } 
     else 
      console.log('Error: ' + result.error.message); 
    }); 

} 
function addEventHandlerToBinding() { 
    Office.select("bindings#ccbind").addHandlerAsync(Office.EventType.BindingDataChanged, onBindingDataChanged); 
} 

var onBindingDataChanged = function (result) { 
     console.log(result);  
    } 

Поскольку существует несколько contentcontrols в документе с названием «CCTitle», addFromNamedItemAsync в функции bindNamedItem даст сообщение об ошибке: Multiple objects with the same name were found.

То, что я пытаюсь достичь - получить идентификатор и контент ContentControls всякий раз, когда пользователь вносит какие-либо изменения в любой из них. Есть ли идея помочь? Заранее спасибо.

ответ

0

Как вы обнаружили, именование элементов управления содержимым не позволяет вам привязываться на основе имени. Тем не менее, есть это обходной путь вы можете использовать для привязки к каждому элементу управления контентом:

  1. Сначала получить Document .contentControls, который возвращает массив всех элементов управления содержимым в документ, названных ContentControlCollection.
  2. Каждый элемент в массиве - ContentControl object. Выполните шаги 3-6 последовательно для каждого ContentControl:
  3. Проверьте имя ContentControl с contentControl.title. Если он соответствует имени, которое вы ищете (CCTitle), выполните следующие действия. В противном случае вернитесь к шагу 3 для следующего ContentControl.
  4. Вызовите ContentControl select() method с параметрами по умолчанию, чтобы вызвать слово для его выбора.
  5. После того, как вы получили подтверждение в обратном вызове, выбранном ContentControl, вызовите Bindings.addFromSelectionAsync() с текстом bindingType.
  6. Как только вы получили подтверждение в обратном вызове, что Binding был успешно создан, вызовите Binding.addHandlerAsync с BindingDataChanged EventType. Использование может использовать одну и ту же функцию обработчика для всех этих привязок, если вы хотите.

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

-Michael (PM для офисных надстроек)

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

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