如何在Word中将一个处理程序绑定到多个ContentControls(具有相同标题)?使用Javascript API



我正在使用JavaScript API Office开发,MS Word 2016,VisualStudio 2015。文档中存在多个具有相同标题的Rich Text ContentContol。我正在尝试将这些ContentControls绑定到一个处理程序,以便获得onBindingDataChanged通知。

有没有一种方法可以将ContentControls绑定到一个具有自己ID的处理程序?还是将ContentControls的id作为一个参数传递?

我当前的代码是:

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

由于标题为"CCTitle"的文档中有多个内容控件,因此函数bindNamedItem中的addFromNamedItemAsync将给出错误:Multiple objects with the same name were found.

我试图实现的是,每当用户对ContentControls中的任何一个进行更改时,都能获得它们的id和内容。有什么主意可以帮忙吗?提前谢谢。

正如您所发现的,内容控件的命名会阻止您基于名称进行绑定。但是,有一个变通方法可以用于绑定到每个内容控件:

  1. 首先检索Document.contentControls,它返回文档中所有内容控件的数组,称为ContentControlCollection
  2. 数组中的每个元素都是一个ContentControl对象。按顺序对每个ContentControl执行步骤3-6:
  3. 使用ContentControl.title检查ContentControl的名称。如果它与您要查找的名称(CCTitle)匹配,则继续执行以下步骤。否则,返回步骤3以进行下一个ContentControl
  4. 使用默认参数调用ContentControl的select()方法,使word选择它
  5. 在回调中收到选择ContentControl的确认后,使用Text bindingType调用Bindings.addFromSelectionAsync()
  6. 在回调中收到绑定已成功创建的确认后,使用BindingDataChanged EventType调用Binding.addHandlerAsync。如果愿意,Use可以对所有这些绑定使用相同的处理程序函数

这种解决方法的缺点之一是有许多链式异步调用,因此性能可能没有您希望的那么快。因此,我建议将此操作与一些用户操作联系起来,并/或在任务窗格中添加加载UI,以避免混淆用户。

-Michael(Office插件的PM)

相关内容

  • 没有找到相关文章

最新更新