是的你可以!这里的关键是要记住,创建绑定实际上是向文档添加内容控件,因此您需要做的是使用应用于选择或文档正文的 contentControls 集合并遍历它以获取阅读顺序。(顺便说一句,如果您只需要选择或所有文件,但我会解释两者)。
现在在示例之前进行一些澄清:
- 实际上, bindings.getAllAsync() 方法与阅读顺序不匹配,但也不是随机的。它实际上按其创建顺序返回绑定,这对您的方案似乎没有用处。
- 另一方面range.contentControls集合(范围可以是选择或文档的正文)将为您提供文档阅读顺序范围内的所有内容控件。请注意,此集合将包括带有和不带有绑定的内容控件。所以你需要确保当你创建你的绑定时,你以一种你以后能够识别它们的方式来做,这很简单,因为你可以使用新的 API 插入一个内容控件,设置它的标题然后使用bindings.addFromNamedItemAsync方法使用标题创建绑定。您还可以设置内容控件的标记,以在解决方案的上下文中识别这表示绑定。
这是一个示例,说明如何创建内容控件并向它们添加 Binding,然后另一个示例显示如何使用 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);
})
}
希望这可以增加清晰度并解除您的场景障碍。感谢和快乐编码!胡安。