Office ContentControls列表不正确

时间:2018-06-21 19:17:55

标签: javascript office-addins

我可以通过两种方法做到这一点,但让我们坚持AddIn本身。如果我创建一个ContentControl:

Word.run((context) => {
    let control = context.document.getSelection().insertContentControl();
    control.tag = 'example';
    control.insertOoxml('<xml here>');
    context.sync();
});

然后,稍后(当然,经过适当的异步处理),我删除了控件:

Word.run((context) => {
    let contentControls = context.document.contentControls;
    context.load(contentControls, 'tag');
    context.sync().then(() => {
        for (let c = 0; c < contentControls.items.length; ++c) {
            if (contentControls.items[c].tag === 'example') {
                contentControls.items[c].delete(false); // delete the contentControl with the matching tag
            }
        }
        context.sync()
    });
});

然后,我检查一下我刚刚删除的控件的内容控件列表:

Word.run((context) => {
    let contentControls = context.document.contentControls;
    context.load(contentControls, 'tag');
    context.sync().then(() => {
        for (var i = 0; i < contentControls.items.length; ++i) {
            if (contentControls.items[c].tag === 'example') {
                // this tag list still includes the deleted content control until I close and reopen the document
            }
        }
    });
});

标签仍显示已删除的内容控件。我必须关闭并重新打开文档才能刷新上下文。我是否缺少与文档当前状态正确同步的步骤? context.sync()还不够吗?

注意:delete()确实有效:内容按预期从文档中消失。当我搜索文档时,它仍然位于控件列表中。


进一步的研究已经确定了原因。

启用TrackChanges时,文档中的ContentControls并未被实际删除。这仍然感觉像是一个单词错误,但是您可以检查contentcontrol上的delete标志(不确定是否确实可行,因为它可能在祖先的某个任意级别),手动管理您的删除操作(如我们所做的那样) ),或关闭跟踪更改以解决此问题。

所有这些,我将把这个作为一个问题留给别人,以防有人获得更好的成绩。

1 个答案:

答案 0 :(得分:0)

在同步上下文后尝试检查列表-在.then回调中:

Word.run((context) => {
    let contentControls = context.document.contentControls;
    context.load(contentControls, 'tag');
    context.sync().then(() => {
        for (let c = 0; c < contentControls.items.length; ++c) {
            if (contentControls.items[c].tag === 'example') {
                contentControls.items[c].delete(false); // delete the contentControl with the matching tag
            }
        }
        context.sync().then(()=> {
            //your updated list
        })
    });
});