我正在使用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和内容。有什么主意可以帮忙吗?提前谢谢。
正如您所发现的,内容控件的命名会阻止您基于名称进行绑定。但是,有一个变通方法可以用于绑定到每个内容控件:
- 首先检索Document.contentControls,它返回文档中所有内容控件的数组,称为ContentControlCollection
- 数组中的每个元素都是一个ContentControl对象。按顺序对每个ContentControl执行步骤3-6:
- 使用ContentControl.title检查ContentControl的名称。如果它与您要查找的名称(CCTitle)匹配,则继续执行以下步骤。否则,返回步骤3以进行下一个ContentControl
- 使用默认参数调用ContentControl的select()方法,使word选择它
- 在回调中收到选择ContentControl的确认后,使用Text bindingType调用Bindings.addFromSelectionAsync()
- 在回调中收到绑定已成功创建的确认后,使用BindingDataChanged EventType调用Binding.addHandlerAsync。如果愿意,Use可以对所有这些绑定使用相同的处理程序函数
这种解决方法的缺点之一是有许多链式异步调用,因此性能可能没有您希望的那么快。因此,我建议将此操作与一些用户操作联系起来,并/或在任务窗格中添加加载UI,以避免混淆用户。
-Michael(Office插件的PM)